2

我对此有些疑惑。当默认堆栈分配的对象构造被允许作为其他结构的成员变量时,为什么不参数化构造?Most Vexing Parse与此有关吗?我也在 ideone 上尝试了 C++0X 并得到了相同的结果。

struct foo{
    foo() {}
    foo(int i) {}
};

struct bar{
  foo obj;      // Allowed
  foo obj2(10); // Not Allowed
};

错误:数字常量前应为“,”或“...”

IdeOne 演示

4

3 回答 3

5

您对 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实际上只是数据类型)

于 2012-10-24T22:02:38.057 回答
1

struct bar {
  foo obj;
  foo obj2;
  foo(): obj2(10) {}
}

这样,在实例化 时barobj2将使用 10 进行构造。

于 2012-10-24T22:01:29.360 回答
1

在 C++11 之前,您不能在声明中初始化成员,除非它们是static const完整的。

在 C++11 中,您可以使用统一初始化和类内成员初始化:

foo obj2{10};

由于构造函数不是显式的,您也可以这样做:

foo obj2 = 10;

不在 C++11 中,您必须在构造函数列表中使用成员初始值设定项。

于 2012-10-24T22:04:27.443 回答