C 20 で明示的にデフォルト設定または削除されたコンストラクターで集約の初期化が失敗するのはなぜですか?

DDD
リリース: 2024-11-02 18:24:30
オリジナル
176 人が閲覧しました

Why Does Aggregate Initialization Fail with Explicitly Defaulted or Deleted Constructors in C  20?

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

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