让我在这个问题之前加上以下代码:
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_的类内初始化器与B构造函数的初始化程序列表中的mya_之间存在冲突。根据C++标准,这是如何解决的?当B的构造完成时,mya_.a_的最终值应该是多少?
发布于 2014-04-10 14:37:16
初始化列表获胜。如果您有另一个未初始化成员的构造函数,就地初始化将获胜。
例如,
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的支撑或相等初始化器中的副作用不会发生。-最终例子]
https://stackoverflow.com/questions/22991180
复制相似问题