2012-05-07 10 views
-1

私はこのようなコンストラクタを作ることを知っている:=デフォルト

foo()=delete; 

は、それがunnaccesible作るが、何についてでしょう:

foo()=default; 

?私はこれを時々見ましたが、私はwhatit手段を知っていない!

+1

http://en.wikipedia.org/wiki/C%2B%2B11#Explicitly_defaulted_and_deleted_special_member_functions –

+3

-1: "この質問は、任意の研究努力を示していません" –

+3

'default'は別の意味を持っているので(これはC++ 11で追加されただけなので)、Googleには難しいかもしれません。 –

答えて

0

それはデフォルトコンストラクタ、引数なしでmeanign 1を推測するために、コンパイルを伝えます。これは、「削除」が与えられていない場合、通常、コンパイラが行うことです。これはC++ 11とdeleteオプションで導入されています。

4

C++ 03では、コンストラクタを定義しないと、コンパイラはデフォルトのコンストラクタを生成します。しかし、他のコンストラクタを定義すると、コンパイラはデフォルトコンストラクタを生成しません。

=defaultは、他のコンストラクタも明示的に定義していても、デフォルトのコンストラクタを生成するようにコンパイラに指示します。これはC++ 11で追加されました。C++ 03(または98)でも同じことをする方法はありませんでした。明示的に定義するコンストラクタは、コンパイラがデフォルトで生成するものと少なくとも少し異なります。

0

コンパイラは、暗黙的に明示的任意のコンストラクタ自分で定義されたていない限り、デフォルトのコンストラクタを生成します。

foo() = default;は、デフォルトでないコンストラクタを定義した場合でも、デフォルトのコンストラクタを生成するようにコンパイラに指示するだけです。それはfoo() {}と同じほとんどだ(しかしKerrek SB's answerを参照してください)。ここで

+0

私はそれが* foo(){}と等価であるかどうかはわかりません。 2つが異なる場合があります。たとえば、 'struct s {int x; '' constexpr foo(){} 'となります。つまり、' s()。x'は 'constexpr'です...とにかくこれを検証する必要があります –

+1

* foo(){}と同じではありません。後者は自明ではない。 –

+0

@KerrekSBあなたが正しいと思われます。セクション12.1.5:_ "デフォルトのコンストラクタは、ユーザーが提供していない場合でも簡単です。"実際の違いは何ですか? –

8

defaultが有用である方法です。

struct this_is_pod 
{ 
    int a; 
    double b; 
}; 

struct this_is_not_pod 
{ 
    char c; 
    float d; 
    this_is_not_pod() { } 
}; 

しかし、私たちための手段を提供したい場合:POD(「昔ながらのデータ」)であるためには、クラス型自明なデフォルトコンストラクタを持たなければならないことを思い出してくださいいくつかの重要な方法でクラスメンバーを初期化しますか?ただ、デフォルト以外のコンストラクタが動作しない書き込み:それは完全にデフォルトコンストラクタがないため

struct foo 
{ 
    int m; 
    void * p; 
    foo(double q, Bar & o) : m(magic(q), p(o.gizmo(m, q)) { } 
}; 

fooは、 PODではありません。 foo() {}のような独自のデフォルトコンストラクタを追加しても、デフォルトのコンストラクタは簡単ではないため、動作しません。 C++ 11はdefaultと救助に来る:

struct foo 
{ 
    int m; 
    void * p; 
    foo(double q, Bar & o) : m(magic(q), p(o.gizmo(m, q)) { } 
    foo() = default; // trivial! 
}; 

static_assert(std::is_pod<foo>::value, "You will never see this message."); 
+0

これは実際には "単純な"コンストラクタが実際に意味するもの、すなわちなぜ=デフォルトが{}と異なるのかについては扱っていません – johnbakers

+0

@FellowsheeL最初の宣言でデフォルト設定されているコンストラクターは、ユーザー定義ではありませんが、ユーザー定義ではありません。 –