破坏聚合初始化:C 20 修改的影响
自 C 17 过渡到 C 20 以来,聚合初始化发生了重大变化当显式构造函数被默认或删除时。在本文中,我们深入研究此修改背后的原因并探讨其含义。
更改的起源
之前,在 C 17 中,允许聚合初始化具有显式默认或删除构造函数的结构。然而,随着 C 20 的采用,C 标准进行了修订,禁止使用任何用户声明的构造函数对结构进行聚合初始化,包括默认或删除的构造函数。
理由
此更改背后的关键动机在于解决聚合初始化中潜在的不一致和混乱。标准委员会认识到,允许使用用户声明的构造函数(即使是默认或删除的构造函数)对结构进行聚合初始化,会导致意外且经常错误的行为。
考虑以下示例:
<code class="cpp">struct Foo { Foo() = default; int bar; }; int main() { Foo test = { 0 }; // Error: Cannot initialize due to defaulted constructor }</code>
在这种情况下,显式提供默认构造函数,即使它本质上对结构的初始化没有影响。但是,在这种情况下允许聚合初始化可能会绕过构造函数,从而可能导致未定义的行为或不一致。
对开发人员实践的影响
聚合初始化实践的变化改变了构建和初始化类和结构的推荐方法。以前,通常的做法是显式默认构造函数来提高代码可读性并确保语法更清晰。但是,根据当前标准,不再建议为需要初始化的类或结构使用默认构造函数。
结论
C 20 中聚合初始化的修改旨在提高代码的清晰度、一致性和安全性。通过禁止使用用户声明的构造函数对结构进行聚合初始化,该标准旨在消除潜在的陷阱并提高代码库的整体可靠性。开发人员应该相应地调整他们的实践以适应这些变化,从而产生更健壮和可维护的 C 应用程序。
以上是为什么 C 20 禁止使用用户声明的构造函数对结构进行聚合初始化?的详细内容。更多信息请关注PHP中文网其他相关文章!