为什么类内初始化器只能使用=或{}?

Why can in-class initializers only use = or {}?

本文关键字:初始化 为什么      更新时间:2023-10-16

类内初始化式(c++ 11的特性)必须用花括号括起来,或者跟在=号后面。不能在括号内指定。

这是什么原因?

我对此不是100%肯定,但这可能是为了防止语法歧义。例如,考虑下面的类:

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal, but a very strange idea.
    int confusing(Overloaded); // <-- This line
};

所指示的行是什么意思?如上所述,这是一个名为confusing的成员函数的声明,该函数接受类型为Overloaded的对象作为参数(其名称未在函数声明中指定),并返回int。如果c++ 11允许初始化器使用括号,这将是不明确的,因为它也可能是一个名为confusingint类型成员的定义,该成员初始化为数据成员Overloaded的值。(这与当前最令人烦恼的解析问题有关。)

通过使用花括号,消除了这种歧义:

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal, but a very strange idea.
    int confusing{Overloaded}; // <-- This line
};

现在,很明显confusing实际上是一个初始化为Overloaded值的int,因为没有办法将其作为函数声明来读取。

希望这对你有帮助!