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