ホームページ > バックエンド開発 > C++ > C 20 で継承されたメンバーを初期化するために指定された初期化子を使用できないのはなぜですか?

C 20 で継承されたメンバーを初期化するために指定された初期化子を使用できないのはなぜですか?

Barbara Streisand
リリース: 2024-10-28 17:13:02
オリジナル
551 人が閲覧しました

Why can't I use designated initializers to initialize inherited members in C  20?

C 20 の指定イニシャライザー: 制限について

C 20 では、指定イニシャライザーは集合体の特定のメンバーを初期化する便利な方法を提供します。ただし、これらのイニシャライザには特定の制限があります。

次のコード例を考えてみましょう。

<code class="cpp">struct Person
{
    std::string name{};
    std::string surname{};
    unsigned age{};
};

struct Employee : Person
{
    unsigned salary{DEFAULT_SALARY};
};

int main()
{
    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Possible
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Error
    Employee e2{.salary{55000}}; // Warning
}</code>
ログイン後にコピー

コードに示されているように、person と Employee は両方とも集計です。ただし、指定された初期化子 (e1) を使用した Employee 集計の初期化はコンパイルに失敗します。これはなぜですか?

答えは C 20 標準、特にセクション 9.3.1 集合体のポイント 3.1 にあります。

「初期化子リストが指定初期化子リストの場合、集合体はクラス型でなければならず、各指定子の識別子はクラスの直接の非静的データ メンバーを指定する必要があり、集合体の明示的に初期化された要素は、それらのメンバーであるか、それらのメンバーを含む要素です。"

言い換えると、指定された初期化子は、現在のクラスのメンバーを初期化するためにのみ使用できます。これらは、継承されたメンバーまたは基本クラスのメンバーには使用できません。この制限は、e1 の初期化が無効である理由です。

e1 を正しく初期化するには、通常のリスト初期化構文を使用できます。

<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 }; // Works</code>
ログイン後にコピー

あるいは、指定された構文と指定された構文を組み合わせて使用​​することもできます。指定されていない初期化子を使用して同じ結果を達成します:

<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 }; // Also works</code>
ログイン後にコピー

この場合、直接の基本クラス (person) は指定された初期化子リストを使用して初期化されますが、Employee クラス全体は指定されていない初期化子リストを使用して初期化されます。初期化子リスト。

全体として、C 20 でクラス階層を操作するときは、指定された初期化子の制限を覚えておくことが重要です。適切な初期化構文を使用することで、基本クラスと派生クラスの両方のデータ メンバーを効果的かつ正確に初期化できます。 .

以上がC 20 で継承されたメンバーを初期化するために指定された初期化子を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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