コンパイラ エラーについて:「クラスの終了前にデフォルトのメンバー初期化子が必要です」
gcc8.2 で以下のコードをコンパイルしようとすると、 Clang7.0 では、次のエラー メッセージが表示される場合があります。
default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class
このエラーは、Downloader クラスの Hints 構造体内の numOfMaxEasyHandles 変数のデフォルト メンバー初期化子に微妙な問題があるために発生します。
<code class="cpp">class Downloader { public: struct Hints { int32_t numOfMaxEasyHandles = 8; //Hints(){} // <= if I uncomment this all works gcc+clang+msvc //Hints() = default; // <= if I uncomment this neither clang no gcc works (msvc - works) }; };</code>
エラーの根本的な原因:
Hints 構造体のデフォルトのコンストラクター Hints() のコメントが解除されている場合、エラー メッセージは表示されません。ただし、デフォルトのコンストラクターが Hints() =default; に置き換えられると、gcc と Clang でエラーが継続します。
この動作は、gcc と Clang の両方で既知のバグです。このようなシナリオでは、コンパイラーは、デフォルトのコンストラクターが存在する場合でも、構造体の定義自体内で numOfMaxEasyHandles のデフォルトのメンバー初期化子を定義する必要があります。
MSVC の動作:
対照的に、MSVC2017 ではこのエラーは発生せず、コードは問題なくコンパイルできます。これは、MSVC がデフォルトのメンバー初期化子を gcc や Clang とは異なる方法で処理するためです。
回避策:
gcc および Clang のエラーを解決するには、デフォルトのメンバーを定義するだけです。構造体の定義内の初期化子:
<code class="cpp">struct Hints { int32_t numOfMaxEasyHandles = 8; };</code>
この変更により、コードは 3 つのコンパイラすべてで正常にコンパイルされるはずです。
以上がデフォルトのコンストラクターを使用している場合でも、gcc と Clang にデフォルトのメンバー初期化子が必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。