を削除=使い方=の意味でのデフォルト)= default
D
のコンストラクタの場合、実際には= delete;
として動作しますか?次のコードがうまくコンパイルされ
答えて
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つの理由を考えることができます:
- これを行動は明確に定義されており、それを拒否する理由はありません。とにかく不法に何かを構築しようとしたときだけエラーを検出します。
- さらに柔軟性があります。
B
にデフォルトコンストラクタを設定すると、自動的にD
に1つのコンストラクタが設定されます。
Is there any reason (use case) to allow = default for D's constructor, when it's actually works as = delete;?
それは=delete
として動作しません。それは、それが何を言おうとしているのかだけを言います。あなたが明示的にコンパイラがデフォルトの実装を生成したがっていること。
コンパイラで生成されたものが削除されて定義されていなければなりません。 B
のデフォルトのコンストラクタは暗黙的に削除されるためです。
私は '= delete'が' = default'ではないことを知っていますが、私のparticalarの場合にはdiffirenceがありますか?私は '= default'を' = delete'に変更すると意味的に何も変わっていないと確信しています。私が間違っている? – alexolut
@alexolut - 関数はいずれかの方法で削除されます。原因は異なります。将来、 'B'がデフォルトのc'torを取得した場合、' D'も同様です。あなたがそれを削除すると、それは削除されません。一部の人はそれが大きな意味論的な違いだと言うでしょう。 – StoryTeller
B
にはデフォルト以外のコンストラクタがあります(コンストラクタはデフォルト値を持たない引数をとります)。
派生D
クラスは、したがって、そのデフォルトコンストラクタが削除される、デフォルトコンストラクタを持っていない(コンパイラがその親クラスのB(int)
コンストラクタを呼び出すことができますD
のコンストラクタを生成することはできませんと。)
D() = default;
デフォルトのコンストラクタがD
であることがわかり、上で説明したように、デフォルトのコンストラクタは削除されます。
- 1. 次のコードは `C++ 03`でコンパイルされますが、` C++ 11`ではコンパイルされません
- 2. 三項式は、次のコードはコンパイルされませんなぜ
- 3. GCC問題:次のコードは、gccでコンパイルされません
- 4. 次のコードはなぜコンパイルされませんか?
- 5. 次のコードはなぜMSVC++でコンパイルされますか?
- 6. 次のコードはC/C++でどのようにコンパイルされますか?
- 7. EFコード一次移行がコンパイルされない
- 8. 次のコードは正常にコンパイルされますが、静的使用時にリンクのエラーが表示される
- 9. バイナリサーチアルゴリズムのPythonコードがコンパイルされない
- 10. Cコードが正しくコンパイルされていない
- 11. 私のコードはコンパイルされません
- 12. CGColorSpaceCreateDeviceRGBのコードはコンパイルされません
- 13. コードは、Visual Studio 2010でコンパイルしますが、次のソースコードは、Visual Studio 2010で正しくコンパイルすべて
- 14. コードがHackerrankでコンパイルされない
- 15. なぜコードがコンパイルされないのかを教えてくれるツール
- 16. 二一見同じ文字列が異なりうまくコンパイルし、次のコードで
- 17. 我々は、彼らが次のコードはうまく動作
- 18. C++フォワードは、コードの次のような単純な部分がコンパイルされたクラス
- 19. CentOS g ++ではC++コードがコンパイルされますが、Visual Studio 2008ではコンパイルされません
- 20. コンパイル次のコードを考える
- 21. マスターページのコードがアセンブリにコンパイルされていません
- 22. Arduino IDEでコンパイルされたコードがAtom PlatformIOでコンパイルされない
- 23. JDK6ではコンパイルされるが、7ではコンパイルされない自己参照型のパラメータ?次のコードは、JDK6を使用してコンパイルし
- 24. コンパイルされていないコードを再コンパイルできません
- 25. なぜこのコードはColiruでコンパイルされますが、Xcodeではコンパイルされませんか?
- 26. なぜこのコードはJava 1.6ではコンパイルされますが、Java 1.7ではコンパイルされませんか?
- 27. なぜこのコードはEclipseコンパイラでコンパイルされますが、javac(maven)ではコンパイルされません
- 28. なぜこのコードはjdk8u45以上でコンパイルされますが、jdk8u25ではコンパイルされませんか?
- 29. 次のコードくださいVB.NET
- 30. 私は次のコードはコンパイルされ、VS 2015で正常に実行されることがわかっ
Bを変更した場合、Dは自動的に正しいことを行います。 –
どのコンパイラを使用していますか?あなたの構造体が空で何もしないので、コンパイラは '= default'で定義されたように完全にスキップしますか? –
g ++ 5.1.0 '注意:デフォルトの定義が不正であるため、D :: D()は暗黙的に削除されます:'と 'error: 'B :: B()'の呼び出しのための関数がありません –