让我先在问题的前面加上以下代码:
struct A
{
explicit A(int i):a_{i} {}
int a_
};
struct B
{
B():mya_{5} {} // Initialize mya_ (again?)
A mya_{7}; // Initialize mya_
};
在struct B
中,我们在mya_
的内联初始值设定项与mya_
的构造函数初始化列表中初始化的B
之间存在冲突。根据C ++标准如何解决这个问题?当mya_.a_
的构造完成时,B
的最终值应该是什么?
答案 0 :(得分:3)
初始化列表获胜。如果你有另一个没有初始化成员的构造函数,就会获得就地初始化。
例如,
struct B
{
B():mya_{5} {}
B(int) {}
A mya_{7};
};
int main
{
B b0; // b.mya_.a_ is 5
B b(42); // b.mya_.a_ is 7
}
来自 12.6.2初始化基础和成员[class.base.init]
如果给定的非静态数据成员同时具有 brace-or-equal-initializer和mem-initializer,初始化 由mem-initializer指定执行,以及非静态数据 member的brace-or-equal-initializer被忽略。 [例子:给定
struct A {
int i = /∗ some integer expression with side effects ∗/ ;
A(int arg) : i(arg) { }
// ...
};
A(int)构造函数只需将i初始化为arg的值, 并且i的支撑或均衡初始化器中的副作用将不会 地点。 - 结束例子]