C 20 中的聚合初始化
在 C 20 中,已显式默认或删除构造函数的结构体的聚合初始化发生了重大变化。此更改会影响以前有效但现在生成错误的代码。
C 20 之前的兼容性
在 C 20 之前,允许对拥有 user- 的结构进行聚合初始化提供的、继承的、显式默认或删除的构造函数。这允许在初始化期间绕过构造函数。
C 20 标准
但是,C 20 标准已修改此行为。现在仅允许对缺少用户声明或继承的构造函数的结构进行聚合初始化。不再允许显式默认或删除的构造函数。实施此更改是为了解决初始化语义中的歧义和混乱。
更改的理由
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中文网其他相关文章!