为什么在 C 20 中显式默认或删除的构造函数聚合初始化失败
在 C 20 中,显式默认或删除的结构体的聚合初始化不再支持构造函数。此更改是 C 标准修订的结果。在 C 20 之前,允许对没有构造函数或仅具有显式默认或删除构造函数的结构进行聚合初始化。然而,在 C 20 中,标准已更新为规定聚合初始化仅适用于没有用户声明或继承的构造函数的结构。
更改背后的原因
引入此更改是为了解决意外且令人困惑的初始化行为的问题。在 C 的早期版本中,显式默认或删除的构造函数可能允许聚合初始化,即使它不是有意的。这可能会导致意外的转换和错误。通过消除这些情况下的聚合初始化,该标准确保初始化始终通过构造函数进行,从而产生一致且可预测的行为。
示例
在 C 之前在 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中文网其他相关文章!