我有这个结构体:
struct
AAA
{
AAA() : bbb(2)
{
// ccc ???
}
int bbb = 1;
int ccc = bbb;
};
据我所知, 如果有一个初始化列表:bbb(2)
,那么表达式bbb = 1
将会被忽略。然后,对于ccc
最终会变成什么,我感到很模糊。
初始化列表和花括号或等号初始化器中哪一个会先被评估?它们之间的规则是什么?
我有这个结构体:
struct
AAA
{
AAA() : bbb(2)
{
// ccc ???
}
int bbb = 1;
int ccc = bbb;
};
据我所知, 如果有一个初始化列表:bbb(2)
,那么表达式bbb = 1
将会被忽略。然后,对于ccc
最终会变成什么,我感到很模糊。
初始化列表和花括号或等号初始化器中哪一个会先被评估?它们之间的规则是什么?
C++11草案 §12.6.2.9 规定:
如果一个非静态数据成员既有花括号或等号初始化式又有成员初始值设定项,那么执行由成员初始值设定项指定的初始化,并忽略非静态数据成员的花括号或等号初始化式。
[ 例如:给定
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。
bbb=1
时,顺序是显然的,先执行bbb=2
,然后执行ccc=bbb
,所以ccc=2
。我认为根据第9段文字,执行顺序没有歧义。 - masoud规则一直是字段的初始化顺序与声明顺序相同,C++11也没有改变这一点。这意味着bbb
的初始化程序首先运行,然后是ccc
的初始化程序。无论初始值设定项是在字段上指定还是作为构造函数的一部分,都不重要。