2014-04-10 69 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-初始化不會採取 地方。 - 結束示例]