为什么类内初始值设定项只能使用=或{}?

7co*_*ows 23 c++ initializer curly-braces c++11

类内初始值设定项(C++ 11特性)必须用花括号括起来或跟在=符号后面.它们可能未在括号内指定.

这是什么原因?

tem*_*def 37

我不是100%肯定这一点,但这可能是为了防止语法模糊.例如,请考虑以下类:

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal, but a very strange idea.

    int confusing(Overloaded); // <-- This line
};
Run Code Online (Sandbox Code Playgroud)

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

通过要求花括号,这种歧义被删除:

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal, but a very strange idea.

    int confusing{Overloaded}; // <-- This line
};
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!