C++幽灵般的构造函数

Jan*_*roň 11 c++ constructor most-vexing-parse

可能重复:
为什么使用一组空括号来调用没有参数的构造函数是错误的?

让我们有这个代码

class Foo {
  Foo(int) { }
};
Run Code Online (Sandbox Code Playgroud)

然后我们有结果:

int main() {
  Foo f1 = Foo(5); // 1: OK, explicit call
  Foo f2(5); // 2: OK, implicit call
  Foo f3(); // 3: no error, "f3 is a non-class type Foo()", how so?
  Foo f4(f1); // 4: OK, implicit call to default copy constructor
  Foo f5; // 5: expected error: empty constructor missing
}
Run Code Online (Sandbox Code Playgroud)

你能解释一下案例3中发生了什么吗?

Bjö*_*lex 12

第三行被解析为声明一个不带参数的函数并返回一个Foo.


Mik*_*our 8

Foo f3();声明一个名为的函数f3,返回类型为Foo.


Kos*_*Kos 5

C++有一个规则,即如果一个语句可以解释为一个函数声明,它就会以这种方式解释.

因此,语法Foo f3();实际上声明了一个不带参数和返回的函数 Foo.通过编写来解决这个问题Foo f3;,它也将调用默认构造函数(当然,如果有的话).