不清楚最烦人的解析

Unclear most vexing parse

让我们假设以下 class Foo.

struct Foo
{
  int i;
};

如果我想创建这个 class 的实例并初始化它,我应该这样做:Foo foo1 = Foo(); 调用构造函数。

int main(void)
{
    foo1 = Foo(); 
    cout << foo1.i << " : " << foo1.j << endl; // " 0 " 
}

然后我想我会用以下行调用默认构造函数,但它没有:

int main(void)
{
    Foo foo2(); // most vexing parse
    cout << foo2  << endl; // " 1 " ??? why?
    foo2.i++; // error: request for member ‘i’ in ‘foo2’, which is of non-class type ‘Foo()’ 
}

为什么 foo2 初始化为 int(1) 而不是 Foo()?

我知道最令人头疼的解析,它告诉我,根据我的理解,当一行可以被解释为一个函数时,它被解释为一个函数。

但是 foo1() 被解释为 int,不是函数,也不是 Foo class。

Foo foo2() 行编译,因为它被解释为函数原型。好的。

为什么这一行编译通过? cout << foo2 << endl;

是否打印 foo2 函数的地址?

正如你所说,Foo foo2();是一个函数声明。对于 cout << foo2foo2 会衰减为函数指针,然后隐式转换为 bool。作为non-null函数指针,转换后的结果是true

不使用 boolalphastd::basic_ostream<CharT,Traits>::operator<< would output 1true

If boolalpha == 0, then converts v to type int and performs integer output.

使用std::boolalpha.

可以看得更清楚
cout << boolalpha << foo2  << endl;  // print out "true"