ホームページ  >  記事  >  バックエンド開発  >  クラスをデフォルトの引数として使用すると、GCC と Clang が「デフォルトのメンバー初期化子が必要です」というメッセージをスローするのはなぜですか?

クラスをデフォルトの引数として使用すると、GCC と Clang が「デフォルトのメンバー初期化子が必要です」というメッセージをスローするのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 10:49:02497ブラウズ

Why Does GCC and Clang Throw

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

この問題は、デフォルトの引数値としてクラスを利用する関数内のクラスメンバーのデフォルトメンバー初期化子。 gcc や Clang などのコンパイラーはこの構造で問題に遭遇しますが、msvc2017 はこれを正常に処理します。

次のコード スニペットを考えてみましょう:

<code class="cpp">class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &amp;hints = Hints());
};</code>

提供されたコードは、numOfMaxEasyHandles のデフォルト値を定義することを目的としています。 Hints 構造体のメンバー。Create 関数のデフォルト引数として使用されます。ただし、gcc と Clang はこのコードのコンパイルに失敗し、次のエラーが発生します。

default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class

エラーの理由

このエラーは、gcc のバグが原因で発生し、 Clang は、関数のデフォルト引数として使用されるクラス内のデフォルトのメンバー初期化子の処理に関係します。コンパイラは、デフォルトのメンバー初期化子が関数本体内ではなく、クラス定義自体内で定義されることを期待します。

考えられる回避策

この問題を解決するには、次の方法があります。考えられる 2 つの回避策:

  1. Hints(){} のコメント解除: Hints 構造体に空のコンストラクターを追加すると、コンパイラ エラーが軽減されます。ただし、このアプローチは、デフォルトのメンバー初期化子を持つ目的を損なうため、望ましくない可能性があります。
  2. Using Hints() =default: このステートメントは、Hints 構造体のデフォルト コンストラクターを明示的に定義します。 。 msvc2017 のコンパイラ エラーは排除されますが、前述のバグにより、コードが gcc および Clang と互換性がなくなります。

以上がクラスをデフォルトの引数として使用すると、GCC と Clang が「デフォルトのメンバー初期化子が必要です」というメッセージをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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