不清楚最烦人的解析
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 << foo2
,foo2
会衰减为函数指针,然后隐式转换为 bool
。作为non-null函数指针,转换后的结果是true
。
不使用 boolalpha
,std::basic_ostream<CharT,Traits>::operator<<
would output 1
为 true
。
If boolalpha == 0, then converts v to type int and performs integer output.
可以看得更清楚
cout << boolalpha << foo2 << endl; // print out "true"
让我们假设以下 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 << foo2
,foo2
会衰减为函数指针,然后隐式转换为 bool
。作为non-null函数指针,转换后的结果是true
。
不使用 boolalpha
,std::basic_ostream<CharT,Traits>::operator<<
would output 1
为 true
。
可以看得更清楚If boolalpha == 0, then converts v to type int and performs integer output.
cout << boolalpha << foo2 << endl; // print out "true"