2016-10-22 18 views
3

たとえば、clangは、struct A以下のデフォルトのデフォルトコンストラクタA() = default;がユーザー提供とはみなされないため、このコードをコンパイルしません。デフォルトのデフォルトのコンストラクタですが、なぜユーザが提供するデフォルトのコンストラクタではないのですか?

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

しかし、あなたは[dcl.fct.def.general]/1を見れば、あなたはわかります

を機能-ボディ:
          ctorの初期化子オプト化合物文
          機能トライブロックである
        = default ;
        = delete ;

= default;が言うように同じであるデフォルトコンストラクタA::A()、用関数本体です上記定義A() = default;A(){}と等価であり、{}は、デフォルトコンストラクタの本体です。ところで

は、g++は、上記のスニペットをコンパイルしますが、私はg++はジョナサン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()= default; ' – 0x499602D2

答えて

7

標準がそう言うので([dcl.fct.def.default]/5):明示的不履行またはその最初の宣言に削除されたユーザー-宣言しない ある場合

機能はユーザー提供です。

このようにすると、trivialityプロパティを= default;に維持できます。それ以外の場合は、別のコンストラクタを持つクラスに簡単なデフォルトのコンストラクタを与える方法はありません。

+0

あなたの答えは優れていて、ポイントまででした。ありがとうございます(+1) – Alexander

+0

あなたが提供した見積もりの​​「削除された」という用語は、[[dcl.fct.def.delete]/4](http://eel.is/c++draft/ dcl.fct.def.delete#4)は、すでに関数の最初の宣言の後に削除された定義が発生することを禁じています。私はここに何かを逃していますか – Alexander

+0

'A()= delete;をユーザーに提供しない@Alexander。 –

関連する問題