2017-12-27 3 views
8

を削除=使い方=の意味でのデフォルト)= defaultDのコンストラクタの場合、実際には= delete;として動作しますか?次のコードがうまくコンパイルされ

+0

Bを変更した場合、Dは自動的に正しいことを行います。 –

+0

どのコンパイラを使用していますか?あなたの構造体が空で何もしないので、コンパイラは '= default'で定義されたように完全にスキップしますか? –

+1

g ++ 5.1.0 '注意:デフォルトの定義が不正であるため、D :: D()は暗黙的に削除されます:'と 'error: 'B :: B()'の呼び出しのための関数がありません –

答えて

11

g++はエラーでの素敵な説明を与える:

bla.cpp:6:5: note: ‘D::D()’ is implicitly deleted because the default definition would be ill-formed: D() = default;

デフォルトコンストラクタはDのすべての部分を構築しようとします。フィールドはありませんが、最初にBがあります。空のコンストラクタはありません。intのみです。

デフォルトの動作では、Bを構築するためにはintを明示的に指定しない限り、空のコンストラクタは使用できません。また、コンパイラは推測したくありません。それ以外の場合はDオブジェクトがあり、Bコンストラクタで何が起こるかによって、Bには、フィールドを初期化する場合など、ジャンクが含まれることがあります。 Bデフォルトコンストラクタが削除されると、これは、「を許可」された理由を尋ねるとき

は、私はあなたが文字通りあなたの質問を意味かどうかわからないんだけど、私は2つの理由を考えることができます:

  1. これを行動は明確に定義されており、それを拒否する理由はありません。とにかく不法に何かを構築しようとしたときだけエラーを検出します。
  2. さらに柔軟性があります。Bにデフォルトコンストラクタを設定すると、自動的にDに1つのコンストラクタが設定されます。
6

Is there any reason (use case) to allow = default for D's constructor, when it's actually works as = delete;?

それは=deleteとして動作しません。それは、それが何を言おうとしているのかだけを言います。あなたが明示的にコンパイラがデフォルトの実装を生成したがっていること。

コンパイラで生成されたものが削除されて定義されていなければなりません。 Bのデフォルトのコンストラクタは暗黙的に削除されるためです。

+0

私は '= delete'が' = default'ではないことを知っていますが、私のparticalarの場合にはdiffirenceがありますか?私は '= default'を' = delete'に変更すると意味的に何も変わっていないと確信しています。私が間違っている? – alexolut

+2

@alexolut - 関数はいずれかの方法で削除されます。原因は異なります。将来、 'B'がデフォルトのc'torを取得した場合、' D'も同様です。あなたがそれを削除すると、それは削除されません。一部の人はそれが大きな意味論的な違いだと言うでしょう。 – StoryTeller

1

Bにはデフォルト以外のコンストラクタがあります(コンストラクタはデフォルト値を持たない引数をとります)。

派生Dクラスは、したがって、そのデフォルトコンストラクタが削除される、デフォルトコンストラクタを持っていない(コンパイラがその親クラスのB(int)コンストラクタを呼び出すことができますDのコンストラクタを生成することはできませんと。)

D() = default;デフォルトのコンストラクタがDであることがわかり、上で説明したように、デフォルトのコンストラクタは削除されます。

関連する問題