私はこのようなコンストラクタを作ることを知っています:
foo()=delete;
アクセスできなくなりますが、次のことはどうでしょうか。
foo()=default;
? たまに見たけど意味わからん!
これがどのよう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.");
C++03 では、コンストラクターを定義しない場合、コンパイラによって既定のコンストラクターが生成されます。ただし、他のコンストラクターを定義した場合、コンパイラーはデフォルトのコンストラクターを (まったく) 生成しません。
他の=default
コンストラクターも明示的に定義した場合でも、コンパイラーにデフォルトのコンストラクターを生成するように指示します。これは C++11 で追加されました。C++03 (または 98) では同じことを行う方法がありませんでした。明示的に定義するコンストラクターは、コンパイラーがデフォルトで生成するコンストラクターとは少なくとも少し異なります。
自分でコンストラクターを明示的に定義しない限り、コンパイラーはデフォルトのコンストラクターを暗黙的に生成します。
はfoo() = default;
、デフォルト以外のコンストラクターを定義した場合でも、コンパイラーにデフォルトのコンストラクターを生成するように指示するだけです。ほとんど同じですfoo() {}
(ただし、Kerrek SB の回答を参照してください)。
これは、デフォルトのコンストラクター、つまり引数のないコンストラクターを推測するようにコンパイルに指示します。これは、「削除」が指定されていない場合、コンパイラが通常行うことです。これは C++11 と削除オプションで導入されました。