【问题标题】:Why "Foo f(Bar());" can be a declaration of a function that takes type Bar and returns type Foo? [duplicate]为什么“Foo f(Bar());”可以是接受类型 Bar 并返回类型 Foo 的函数的声明? [复制]
【发布时间】:2015-02-21 05:08:38
【问题描述】:

我遇到了这个 C++ 问题:

问题:以下是定义还是声明?

Foo f(Bar());

答案:它可能是一个接受类型 Bar 并返回类型 Foo 的函数的声明,或者它是作为类型 Foof 的定义,它有一个接受类型 Bar 的构造函数。问题是两者的语法是相同的,因此为了解决这个问题,C++ 标准规定编译器必须更喜欢函数声明而不是无法区分的对象定义。

-- 我不明白为什么它可以是“一个接受类型 Bar 并返回类型 Foo 的函数的声明”?参数列表中怎么会出现括号“()”?

【问题讨论】:

  • JFC 不再是这玩意了

标签: c++


【解决方案1】:

函数f实际上接受一个函数指针,指向一个不带参数的函数,并给出一个Barf 的参数类型是 Bar (*)()

这段代码编译失败(我们可以在错误信息中看到参数的实际类型):

class Foo { };
class Bar { };

Foo f(Bar());

int main() {
  Bar b;
  f(b);
  return 0;
}

但是这段代码确实可以编译:

class Foo { };
class Bar { };

Foo f(Bar());

Bar g();

int main() {
  f(g);
  return 0;
}

正如您在问题中所说,它可能具有的第二个含义是您正在创建一个名为 f 的新 Foo 对象,并且您正在使用 Bar() 调用构造函数(Bar 的新实例)。它类似于:

Foo f = Foo(Bar());

Foo f(Bar()); 这种情况下,编译器选择了第一个解释。

有点令人困惑,如果你添加另一组括号,如

Foo f((Bar()));

编译器选择第二种解释。

【讨论】:

  • 为什么第一段代码不能编译?这不是原帖中提到的第二种可能性,将 f 定义为 Foo 类型,它有一个采用 Bar 类型的构造函数吗?
  • @athos 因为f 需要一个函数指针作为第一个参数。语句 f(b);, b 在此上下文中不是 func 指针。
  • @greatwolf 我明白了。这个编译器更喜欢函数声明而不是对象定义。
  • @athos All 必须符合 C++ 标准的编译器。正如您所说:“C++ 标准规定编译器必须更喜欢函数声明而不是无法区分的对象定义。”
  • @clcto 是的。谢谢提醒。我忽略了那部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2017-06-23
  • 2015-10-26
  • 2020-08-03
  • 1970-01-01
相关资源
最近更新 更多