类内初始化器中的歧义预防
为什么类内初始化器仅限于用大括号括起来或使用赋值运算符(=)?与可以使用括号的方法声明不同,类内初始化程序必须遵守此特定语法。
限制的基本原理
此限制旨在规避潜在的语法含糊不清。考虑以下类定义:
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中文网其他相关文章!