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() { Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile Employee e2 {.salary{55000}}; // warning: missing initializer for base class member }</code>
指定された初期化子は初期化にしか使用できないため、コードは e1 のコンパイルに失敗します。派生クラスの非静的メンバーを直接呼び出します。つまり、指定されたイニシャライザを使用して基本クラスのメンバーを直接初期化することはできません。
これを解決するには、次のアプローチを使用できます。
従来のリストの初期化:
<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 };</code>
ネストされた指定初期化子リスト:
<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };</code>
あるいは、@Jarod42 が提案しているように、初期化子リストを指定することもできます基本クラスの場合は明示的に:
<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, .salary{50000} };</code>
これにより、指定された初期化子を使用して、直接の基本クラスのメンバーと派生クラスのメンバーの両方を初期化できます。
以上が指定された初期化子を使用して C 20 の基本クラスのメンバーを初期化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。