ホームページ > バックエンド開発 > C++ > 非自明なコンストラクターをデフォルトの引数として使用すると、「クラスの終了前にデフォルトのメンバー初期化子が必要です」エラーが発生するのはなぜですか?

非自明なコンストラクターをデフォルトの引数として使用すると、「クラスの終了前にデフォルトのメンバー初期化子が必要です」エラーが発生するのはなぜですか?

DDD
リリース: 2024-10-29 08:04:02
オリジナル
798 人が閲覧しました

Why Does

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

このコード スニペット内:

<code class="cpp">#include <cassert>
#include <iostream>
#include <cstdlib>

class Downloader
{
public:
    struct Hints
    {       
        int32_t numOfMaxEasyHandles = 8;
    };

    static Downloader *Create(const Hints &hints = Hints());
};

Downloader* Downloader::Create(const Hints &hints)
{
    std::cout << hints.numOfMaxEasyHandles << std::endl;
    return nullptr;
}</code>
ログイン後にコピー

構造体ヒントのインスタンスを構築するデフォルトの引数を定義しようとすると、Clang および GCC コンパイラによって「囲んでいるクラスの終了前にデフォルトのメンバー初期化子が必要です」というエラー メッセージが表示されます。

理由エラー

の場合 このエラーは、Create 関数のデフォルトの引数が非自明なコンストラクターであるために発生します。これには、Hints 構造体の宣言内でデフォルトのメンバー初期化子を定義する必要があります。メンバー初期化子がないと、コンパイラーは、デフォルト引数が使用されるときに numOfMaxEasyHandles メンバーの初期値を決定できません。

解決策

この問題を解決するには、ヒント 構造体には、次のようにデフォルトのメンバー初期化子を含める必要があります。

<code class="cpp">struct Hints
{       
    int32_t numOfMaxEasyHandles = 8;
    Hints() {}  // Default member initializer
};</code>
ログイン後にコピー

デフォルトのメンバー初期化子を配置すると、Clang と GCC の両方がコードを正常にコンパイルできるようになります。このソリューションが機能するには、Hints 構造体が明示的なデフォルト コンストラクターを定義する必要があることに注意してください。

GCC および Clang Bug

次の行に気づくかもしれません:

<code class="cpp">Hints() = default;</code>
ログイン後にコピー

では、Clang と GCC の問題は解決されません。これは、これらのコンパイラの既知のバグであり、自明ではないコンストラクターのデフォルトのメンバー初期化子が、コンストラクターがデフォルトの引数として使用されている場合など、特定のコンテキストでは正しく認識されません。

以上が非自明なコンストラクターをデフォルトの引数として使用すると、「クラスの終了前にデフォルトのメンバー初期化子が必要です」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート