C 11 でクラス内初期化が可能: 変更の動機は何ですか?
C 11 以前の時代では、クラス内初期化は静的 const メンバーに制限されます。この制限は、複数の翻訳単位のシナリオにおけるリンカーの複雑化を回避する必要があることが原因でした。
しかし、C 11 の導入により、これらの制限が緩和され、非静的および非静的オブジェクトのクラス内初期化が可能になりました。 const メンバー (§12.6.2/8).
制限の元の理由は依然として有効ですが、C 11 は負担を変更するソリューションを実装しました。コンパイラへのリンカ。複数の定義を許可する代わりに、コンパイラーが初期化を処理するようになりました。
brace-or-equal-initializer を持つ非静的メンバーの場合、初期化は 8.5 に従って実行されます。それ以外の場合、バリアント メンバー (9.5) の場合、初期化は行われません。それ以外の場合はすべて、デフォルトの初期化 (8.5) が実行されます。
さらに、constexpr 指定子でマークされた非 const 静的メンバーをクラス内で初期化できるようになりました (9.4.2)。
この変更により、コードのメンテナンスが簡素化され、柔軟性が向上しますが、プログラミング ルールが若干複雑になります。たとえば、メンバーに複数の初期化子が指定されている場合、初期化された値は使用されるコンストラクターによって決定されます。デフォルトのコンストラクターが呼び出される場合、クラス内初期化子が使用されます。デフォルト以外のコンストラクターが値を指定する場合、クラス内初期化子は無視されます。
全体的に、この変更は、リンカーの信頼性を犠牲にすることなく、開発者の人間工学の改善に重点を置いていることが反映されています。コンパイラーは、懸念事項の明確な分離を維持しながら、これらの機能を促進するために、より複雑な役割を担うようになりました。
以上がC 11 で非静的メンバーのクラス内初期化が有効になったのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。