【发布时间】:2019-11-30 10:56:35
【问题描述】:
让我们假设以下类 Foo。
struct Foo
{
int i;
};
如果我想创建这个类的一个实例并初始化它,我应该这样做: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()?
我知道最令人头疼的 parse,它告诉我,根据我的理解,当一行可以被解释为一个函数时,它被解释为一个函数。
但是 foo1() 被解释为一个 int,不是一个函数,也不是一个 Foo 类。
Foo foo2() 行编译是因为它被解释为函数原型。好的。
为什么这行会编译? cout << foo2 << endl;
它会打印 foo2 函数的地址吗?
【问题讨论】:
-
使用调试器找出编译器选择了哪个
operator<<重载。 -
如果我想创建这个类的一个实例并初始化它,我应该这样做:
Foo foo1 = Foo();来调用构造函数。不,你应该这样做Foo foo1;或Foo foo1 {};,这取决于你想做什么。 -
请注意,这里没有“最麻烦的解析”。最令人头疼的解析确实涉及关于函数声明的相同规则。这是最令人头疼的解析示例:
Foo foo2(int());(重写了我的评论,因为我原来的示例并不完整)
标签: c++ struct constructor default-constructor most-vexing-parse