簡體   English   中英

列表初始化 - C++14 發生了什么變化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM