明示的なデフォルトまたは削除されたコンストラクターが 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 サイトの他の関連記事を参照してください。