ホームページ > バックエンド開発 > C++ > C 20 で明示的にデフォルト設定または削除されたコンストラクターを含む構造体に対して集約の初期化が許可されなくなったのはなぜですか?

C 20 で明示的にデフォルト設定または削除されたコンストラクターを含む構造体に対して集約の初期化が許可されなくなったのはなぜですか?

Patricia Arquette
リリース: 2024-11-03 08:29:30
オリジナル
701 人が閲覧しました

Why Is Aggregate Initialization No Longer Allowed for Structs with Explicitly Defaulted or Deleted Constructors in C  20?

C 20 での集合体の初期化

C 20 では、明示的にデフォルト設定された、または削除されたコンストラクターを持つ構造体の集合体初期化が大幅に変更されました。この変更は、以前は有効であったコードに影響しますが、現在はエラーが生成されます。

C 20 より前の互換性

C 20 より前では、ユーザー定義の構造体に対して集合体初期化が許可されていました。提供、継承、または明示的にデフォルト設定または削除されたコンストラクター。これにより、初期化中のコンストラクターのバイパスが可能になりました。

C 20 標準

ただし、C 20 標準ではこの動作が改訂されました。集約の初期化は、ユーザー宣言または継承されたコンストラクターが存在しない構造体に対してのみ許可されるようになりました。明示的にデフォルト設定または削除されたコンストラクターは許可されなくなりました。この変更は、初期化セマンティクスのあいまいさと混乱に対処するために実装されました。

変更の根拠

C 標準におけるこの変更の背後にある理論的根拠は、C 標準を強化したいという要望に根ざしています。初期化の安全性、均一性、明確さ。以前の動作では、次の図に示すように、予期しない誤ったコードが発生する可能性があります。

struct X {
  int i{4};
  X() = default;
};

int main() {
  X x1(3); // ill-formed - no matching c’tor
  X x2{3}; // compiles!
}
ログイン後にコピー

この例では、メンバー変数 i が初期化で宣言されているため、X のデフォルトのコンストラクターを初期化に使用できません。値は 4 です。ただし、集約の初期化が誤って許可され、あいまいで潜在的に不正な動作が発生します。

コードへの影響

この変更により、集約が使用できない場合のコードの変更が必要になります。初期化は、以前は明示的にデフォルト設定または削除されたコンストラクターで使用されていました。これにより、開発者は、集約データ型のコンストラクターを明示的にデフォルト設定する方法を再考する必要があります。

結論として、集約の初期化に関する C 20 標準の変更は、初期化イディオムの信頼性と一貫性を向上させることを目的としており、潜在的な下位非互換性を正当化します。紹介します。

以上がC 20 で明示的にデフォルト設定または削除されたコンストラクターを含む構造体に対して集約の初期化が許可されなくなったのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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