簡體   English   中英

C ++ 11默認構造函數中的引用初始化

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

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