我对此感到有点困惑。当默认堆栈分配的对象构造被允许作为其他结构的成员变量时,为什么不参数化构造? Most Vexing Parse与此有关吗?我在ideone上尝试了C ++ 0X并获得了相同的结果。
struct foo{
foo() {}
foo(int i) {}
};
struct bar{
foo obj; // Allowed
foo obj2(10); // Not Allowed
};
错误:在数字常量
之前预期','或'...'
答案 0 :(得分:5)
您指向Most Vexing Parse的链接讨论了非成员变量的实例化(不是类/结构成员的变量)。您展示的示例是在结构中声明的成员变量;您通常会在构造函数中初始化它们
struct bar
{
foo obj;
foo obj2;
bar() : obj2(10) {}
};
最令人烦恼的解析问题出现在以下情况中:
struct baz
{
baz(int n) {}
};
void foo()
{
baz meow(int());
}
标识符meow
似乎是baz (int)
类型的函数声明,因为您的链接中描述了“最令人烦恼的解析”问题。 ( int()乍一看似乎是默认初始化实际上只是数据类型int
)
答案 1 :(得分:1)
写
struct bar {
foo obj;
foo obj2;
foo(): obj2(10) {}
}
这样,在实例化bar
时,obj2
构造将使用10。
答案 2 :(得分:1)
在C ++ 11之前,您无法初始化声明中的成员,除非它们是static const
和整数。
在C ++ 11中,您可以使用统一初始化和类内成员初始化:
foo obj2{10};
由于构造函数不明确,您也可以这样做:
foo obj2 = 10;
不在C ++ 11中,您必须在构造函数列表中使用成员初始值设定项。