In-class initializers(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允许初始化程序使用括号,则这将是模棱两可的,因为它也可能是名为intconfusing类型的成员的定义,该成员被初始化为数据成员Overloaded的值。 (这与Most Vexing Parse的当前问题有关。)

通过使用花括号,可以消除这种歧义:
class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal, but a very strange idea.

    int confusing{Overloaded}; // <-- This line
};

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

希望这可以帮助!

07-25 23:24