2012-10-24 151 views
2

我对此有点困惑。当默认堆栈分配的对象结构被允许作为其他结构的成员变量时,为什么不参数化构造? Most Vexing Parse与此有什么关系?我尝试了C++ 0X以及ideone并获得了相同的结果。参数构造函数调用

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

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

Error: expected ‘,’ or ‘...’ before numeric constant

IdeOne Demo

回答

5

提出您对最棘手的解析链接讨论实例非成员变量(变量这些不是类/结构的成员)。你已经展示的例子是在结构中声明成员变量的例子。要为其通常初始化它们在一个构造中的情况下发生

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

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

这样,实例bar时,obj2建设将与10

1

此前C++ 11,你不能在声明中初始化成员,除非他们分别是static const和积分。

在C++ 11,可以使用统一的初始化和类成员initializtion:

foo obj2{10}; 

由于构造不明确,你也可以这样做:

foo obj2 = 10; 

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