-1

私はこのようなコンストラクタを作ることを知っています:

foo()=delete;

アクセスできなくなりますが、次のことはどうでしょうか。

foo()=default;

? たまに見たけど意味わからん!

4

4 に答える 4

8

これがどのようdefaultに役立つかです。POD (「plain old data」) であるためには、クラス型に自明なデフォルト コンストラクター必要であることを思い出してください。

struct this_is_pod
{
     int a;
     double b;
};

struct this_is_not_pod
{
    char c;
    float d;
    this_is_not_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.");
于 2012-05-07T15:37:38.577 に答える
4

C++03 では、コンストラクターを定義しない場合、コンパイラによって既定のコンストラクターが生成されます。ただし、他のコンストラクターを定義した場合、コンパイラーはデフォルトのコンストラクターを (まったく) 生成しません。

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

于 2012-05-07T15:07:27.270 に答える
0

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

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

于 2012-05-07T15:11:24.307 に答える
0

これは、デフォルトのコンストラクター、つまり引数のないコンストラクターを推測するようにコンパイルに指示します。これは、「削除」が指定されていない場合、コンパイラが通常行うことです。これは C++11 と削除オプションで導入されました。

于 2012-05-07T15:04:23.280 に答える