![](/img/trans.png)
[英]C++14 Initializing inherited member in class constructor initialization list
[英]List initialization - What changed in C++14?
這兩行來自cppreference
這兩種說法有什么區別? 我看不出有什么區別
直到 c++14
如果括號初始化列表為空並且 T 是具有默認構造函數的 class 類型,則執行值初始化。 否則,如果 T 是聚合類型,則執行聚合初始化。
自 c++14
如果 T 是聚合類型,則執行聚合初始化。 否則,如果括號初始化列表為空並且 T 是具有默認構造函數的 class 類型,則執行值初始化。
不同之處在於兩個條件都適用時會發生哪一個:如果T是聚合 class(與數組相反),它肯定有一個默認構造函數,並且括號初始化列表為空。 當然,要理解為什么這很重要,我們必須將值初始化與聚合初始化與空列表區分開來。
值初始化對 object 進行零初始化,然后對其進行默認初始化,對於聚合而言,默認初始化其每個成員,因此值初始化是按成員進行的(加上零填充)。 聚合初始化從{}
初始化每個成員,這再次是許多類型的值初始化,但對於 class 類型的成員使用用戶提供的默認構造函數是默認初始化。 可以看出區別
struct A {A() {} int i;};
struct B {A a;}; // aggregate
B b{}; // i is 0 in C++11, uninitialized in C++14
B b2=B(); // i is 0 in both versions
僅在 C++14 中,聚合可以有默認的成員初始化器; 當然,這不會導致兩種語言版本之間的行為差異,但是無論如何它在這兩個規則之間的行為並沒有不同(因為它只替換了常見的默認初始化)。
不同之處在於檢查的順序,因此首先進行聚合類型檢查,然后是 rest。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.