ホームページ  >  記事  >  バックエンド開発  >  デフォルトのコンストラクターを使用している場合でも、gcc と Clang にデフォルトのメンバー初期化子が必要なのはなぜですか?

デフォルトのコンストラクターを使用している場合でも、gcc と Clang にデフォルトのメンバー初期化子が必要なのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-28 06:46:02236ブラウズ

Why Does gcc and clang Require a Default Member Initializer Even with a Default Constructor?

コンパイラ エラーについて:「クラスの終了前にデフォルトのメンバー初期化子が必要です」

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。