首页 >后端开发 >C++ >为什么显式默认或删除构造函数会阻止 C 20 中的聚合初始化?

为什么显式默认或删除构造函数会阻止 C 20 中的聚合初始化?

Patricia Arquette
Patricia Arquette原创
2024-11-02 16:28:03291浏览

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 成员变量为 3。但是,此行为与用户定义的构造函数不一致。此更改解决了此不一致问题。

替代解决方案

要解决此错误,不应将显式默认或删除的构造函数用于聚合类型。相反,请考虑省略构造函数或使用用户定义的构造函数。

以上是为什么显式默认或删除构造函数会阻止 C 20 中的聚合初始化?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn