2016-10-22 185 views
3

例如,clang不編譯該代碼,這是因爲,低於struct A的缺省默認的構造,A() = default;不被認爲是用戶提供的。默認的默認構造函數,爲什麼不是用戶提供的默認構造函數?

struct A{ A() = default; }; 
const A a; 

但是,如果你看一下[dcl.fct.def.general]/1你會看到:

功能體:
          構造函數初始化程序選擇複合語句
          功能試塊
        = default ;
        = delete ;

也就是說,= default;是默認的構造函數A::A(),這是相同的話說,函數體上述定義A() = default;相當於A(){}{}是默認構造函數的主體。

順便說一下,g++編譯上面的代碼片段,但是我知道g++在這方面還有其他問題,根據Jonathan Wakely的this comment

+0

奇怪,你說,[clang失敗](http://coliru.stacked-crooked.com/a/45816775ce659464),[gcc編譯](http://coliru.stacked-crooked.com/a/ 137a9ea1c836152b)。 VS2015也是如此。 – wally

+1

用戶提供的顯式默認類似於struct A {A();}; A :: A()=默認;' – 0x499602D2

回答

7

因爲標準是這樣說的([dcl.fct.def.default]/5):

的功能被用戶提供如果是用戶聲明並沒有明確 拖欠或首次聲明中刪除。

這樣做可以讓您使用= default;來維護平凡性屬性。否則,沒有辦法給另一個構造函數一個簡單的默認構造函數。

+0

您的回答非常好,並且重點突出。謝謝(+1) – Alexander

+0

我想您所提供的報價「刪除」一詞是沒有必要的,因爲[dcl.fct.def.delete/4](http://eel.is/c++draft/ dcl.fct.def.delete#4)已經禁止在函數第一次聲明後發生已刪除的定義。我在這裏錯過了什麼嗎? – Alexander

+0

@Alexander使'A()= delete;'不是用戶提供的。 –