[英]Reference initialization in C++11 default constructor
struct X {};
struct Y {
Y() = default;
X& x;
};
在C ++ 11中工作正常。 我想知道Y :: x是如何在幕后實際初始化的?
即使你明確指出Y()
應該是默認的,編譯器也有義務在某些條件下刪除默認構造函數(強調添加):
8.4.2 / 4明確違約的職能
顯式默認函數和隱式聲明函數統稱為默認函數,實現應為它們提供隱式定義(12.1 12.4,12.8), 這可能意味着將它們定義為已刪除
和
12.1 / 5構造函數:
...
...如果出現以下情況,則將類X的默認默認構造函數定義為已刪除:
- 任何沒有大括號或等號初始化程序的非靜態數據成員都是引用類型
但是,除非您實際嘗試使用它,否則定義已刪除的函數或構造函數並不是錯誤:
8.4.3 / 2刪除的定義
除了聲明它之外,隱式或顯式引用已刪除函數的程序是不正確的。
它不在任何主要編譯器中編譯。 它將編譯,直到創建Y
類型的對象。
如果創建Y
類型的對象,則輸出clang
error: call to implicitly-deleted default constructor of 'Y'
note: explicitly defaulted function was implicitly deleted here
Y() = default;
note: default constructor of 'Y' is implicitly deleted because field
'x' of reference type 'X &' would not be initialized
X& x;
當您聲明user-defined
構造函數(它只是空函數)時,會出現錯誤,而不會創建對象。
邁克爾伯爾是對的。 隱式默認的構造函數非常好。 我可以看到,這里的診斷沒有問題。
如果你不制作Y對象,它“有效”。 一旦你做了一個你會得到一個錯誤:
(GCC 4.8.0)
錯誤:'struct Y'中未初始化的引用成員
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.