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