首页 >后端开发 >C++ >为什么类内初始化器仅限于花括号或赋值运算符?

为什么类内初始化器仅限于花括号或赋值运算符?

DDD
DDD原创
2024-12-21 06:43:14460浏览

Why Are In-Class Initializers Restricted to Curly Braces or the Assignment Operator?

类内初始化器中的歧义预防

为什么类内初始化器仅限于用大括号括起来或使用赋值运算符(=)?与可以使用括号的方法声明不同,类内初始化程序必须遵守此特定语法。

限制的基本原理

此限制旨在规避潜在的语法含糊不清。考虑以下类定义:

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Strange but legal data member

    int confusing(Overloaded); // Function declaration or data member initialization?
};

如果类内初始值设定项允许使用括号,则此代码将导致歧义。一方面,“int fusion(Overloaded);”行可以解释为接受 Overloaded 类型的参数并返回 int 的函数声明。另一方面,它也可以被读取为具有重载数据成员的值的 int 类型的数据成员初始化。 (这与臭名昭著的“最令人烦恼的解析”问题有关。)

用大括号消除歧义

通过强制使用大括号,可以消除这种歧义:

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Strange but legal data member

    int confusing{Overloaded}; // Clearly a data member initialization
};

现在很明显,混淆是一个明确的 int初始化为 Overloaded 的值,因为没有范围将其解释为函数声明。

此语法限制确保类定义清晰明确,防止因语法混乱而产生意外后果。

以上是为什么类内初始化器仅限于花括号或赋值运算符?的详细内容。更多信息请关注PHP中文网其他相关文章!

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