C 20 で明示的にデフォルト設定または削除されたコンストラクターで集合体の初期化が失敗する理由
C 20 では、明示的にデフォルト設定または削除された構造体の集合体の初期化が失敗するコンストラクターはサポートされなくなりました。この変更は、C 標準の改訂の結果です。 C 20 より前は、コンストラクターを持たないか、明示的にデフォルト設定または削除されたコンストラクターのみを持つ構造体に対して集約の初期化が許可されていました。ただし、C 20 では、標準が更新され、ユーザー宣言または継承されたコンストラクターを持たない構造体に対してのみ集約の初期化が許可されることが規定されました。
変更の背後にある理由
この変更は、予期せぬ混乱を招く初期化動作の問題に対処するために導入されました。 C の以前のバージョンでは、明示的にデフォルト設定または削除されたコンストラクターにより、意図しない場合でも集約の初期化が許可される可能性がありました。これにより、予期しない変換やエラーが発生する可能性があります。このような場合に集合体初期化を排除することで、標準では初期化が常にコンストラクターを通じて行われるようになり、一貫性のある予測可能な動作が実現されます。
例
Before C 20 では、次のコードはエラーなしでコンパイルされました。
<code class="cpp">struct Foo { Foo() = default; int bar; }; auto test = Foo { 0 }; // Aggregate initialization</code>
ただし、C 20 では、コンストラクターが明示的にデフォルト設定され、集合体の初期化が許可されなくなったため、同じコードはコンパイラ エラーを引き起こします。この問題を解決するには、明示的にデフォルト設定されたコンストラクターを削除するか、コンストラクターを使用して明示的に初期化を行うことができます:
<code class="cpp">auto test = Foo(0); // Constructor initialization</code>
コーディング慣行への影響
明示的にコンストラクターをデフォルトにするか削除することは、以前は良い習慣と見なされていましたが、C 20 標準の変更により、それはもはや有益ではないことが示唆されています。 C 20 以降のバージョンでは、暗黙的なデフォルトのコンストラクターの動作に依存し、特別な理由がない限りコンストラクターを明示的にデフォルト設定したり削除したりしないことをお勧めします。
以上がC 20 で明示的にデフォルト設定または削除されたコンストラクターで集約の初期化が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。