2014-04-10 249 views
0

让我用下面的代码前面的问题:解决冲突

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++标准解决这个问题,当B的构建完成时mya_.a_的最终值应该是多少?

回答

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]

如果一个给定的非静态数据成员既具有 撑-or-equal-initializer和mem-initializer,将执行mem初始化程序指定的初始化 ,并忽略非静态数据 成员的括号或等于初始值设定项。 [实施例:鉴于

struct A { 
int i = /∗ some integer expression with side effects ∗/ ; 
A(int arg) : i(arg) { } 
// ... 
}; 

的A(int)构造将简单地初始化i到精氨酸, 和副作用的值在我的大括号或-equal-初始化不会采取 地方。 - 结束示例]