让我在问题之前添加以下代码:
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
的建设完成?
初始化列表获胜。如果您有另一个不初始化成员的构造函数,则就地初始化将获胜。
例如,
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]
如果给定的非静态数据成员同时具有大括号或相等初始化程序和mem初始化程序,则执行由mem初始化程序指定的初始化,并且非静态数据成员的大括号或相等初始化程序为忽略了。[示例:给定
struct A {
int i = /∗ some integer expression with side effects ∗/ ;
A(int arg) : i(arg) { }
// ...
};
A(int)构造函数将简单地将i初始化为arg的值,并且不会发生i的大括号或相等初始化器中的副作用。—结束示例]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句