我有这个结构,
struct
AAA
{
AAA() : bbb(2)
{
// ccc ???
}
int bbb = 1;
int ccc = bbb;
};
AFAIK,如果有初始化列表:bbb(2)
,则忽略表达式bbb = 1
。然后,对我来说,ccc
最终会成为什么样的模糊不清。
首先评估 initialization-list 或大括号还是相等的初始化程序中的哪一个?它们之间的规则是什么?
答案 0 :(得分:12)
C++11 draft§12.6.2.9说;
如果给定的非静态数据成员同时具有 brace-or-equal-initializer和mem-initializer,初始化 由mem-initializer指定执行,并且是非静态的 数据成员的brace-or-equal-initializer被忽略。
[例如:给定
struct A {
int i = /∗ some integer expression with side effects ∗/ ;
A(int arg) : i(arg) { }
// ...
};
A(int)构造函数只需将i初始化为arg的值, 并且i的支撑或等于初始化器的副作用将不会 地点。 - 结束例子]
由于初始化是在声明顺序(第12.6.2.10节)中完成的,并且添加了此规则,因此bbb
和ccc
的值都将为2。
答案 1 :(得分:11)
规则始终是始终按声明的顺序初始化,而C ++ 11并没有改变它。这意味着bbb
的初始化程序首先运行,然后ccc
的初始化程序运行。无论是在字段上指定初始化程序还是作为构造函数的一部分,都无关紧要。