我試着去了解@bolov的第一接受答案的問題Deleted default constructor. Objects can still be created... sometimes [1]C++ 11的值初始化之前聚集初始化
好像我發現有一個錯誤,所以它弄亂整個解釋。
@bolov解釋了爲什麼這個代碼成功地C++ 11編譯:
方案A
struct foo {
foo() = delete;
};
// All bellow OK (no errors, no warnings)
foo f = foo{};
foo f = {};
foo f{}; // will use only this from now on.
爲什麼這個代碼失敗在C++ 11編譯:
情形C
struct foo {
foo() = delete;
foo(int) {};
};
foo f{}; // error call to deleted constructor
他說的重點是,第一個foo是一個聚合,第二個foo不是聚合。
然後他給出了cppreference摘錄:
類型T的對象的列表初始化的效果是: ...
- 如果T是一個聚合類型,集合初始化被執行。這需要照顧的情況ABDE(和F在C++ 14)
否則的T構造的方式分兩個階段考慮:
所有構造函數採取的std :: initializer_list ...
否則[...] T ...的所有構造參與重載解析[...]這需要護理的C(和F在C++ 11) ...
根據摘錄時你寫的foo f {};在場景A你得到聚合初始化。這將是偉大的。但是,在C++ 11現實(#3337草案,最接近標準)你有不同的初始化順序:
對象或類型T的參考的列表初始化定義如下:
- 如果初始化程序列表中沒有元素並且T是具有默認構造函數的類類型,則該對象將進行值初始化。否則,如果T是一個聚合,則執行聚合初始化(8.5.3)。1)
所以FOO˚F{}; in 方案A應導致值初始化,即將調用DELETED默認構造函數,並且代碼將無法編譯。
我不知道你在問什麼。 – Barry
試圖讓它更簡潔。 – JenyaKh
@Quentin,好吧,我會盡量寫得更好。 – JenyaKh