C 20 でコンストラクターを明示的にデフォルトまたは削除すると集合体の初期化が妨げられるのはなぜですか?

Patricia Arquette
リリース: 2024-11-02 16:28:03
オリジナル
145 人が閲覧しました

Why Does Explicitly Defaulting or Deleting Constructors Prevent Aggregate Initialization in C  20?

明示的なデフォルトまたは削除されたコンストラクターが C 20 で集合体の初期化を妨げる理由

C 20 では、集合体の初期化に影響する変更が導入されています。以前は、許可された構造体は明示的にデフォルト設定されたり、コンストラクターが削除されたりする可能性がありました。しかし、これはもう当てはまりません。

理由

この変更は、C の初期化セマンティクスを改善し、より一貫性のあるものにしたいという要望によって動機付けられています。明示的にデフォルト設定または削除されたコンストラクターを使用して集約の初期化を許可すると、混乱を招く予期しない動作が発生する可能性があります。

たとえば、次のコードを考えてみましょう。

<code class="cpp">struct X {
  int i{4};
  X() = default;
};

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

C 17 では、x2 は i メンバーを初期化します。ただし、この動作はユーザー定義のコンストラクターと矛盾していました。この変更により、この不一致が解決されました。

代替解決策

エラーを解決するには、明示的にデフォルトまたは削除されたコンストラクターを集約型に使用しないでください。代わりに、コンストラクターを省略するか、ユーザー定義のコンストラクターを使用することを検討してください。

以上がC 20 でコンストラクターを明示的にデフォルトまたは削除すると集合体の初期化が妨げられるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!