26

类内初始化器(C++11 特性)必须用大括号括起来或跟在 = 符号后面。它们可能不在括号内指定。

这是什么原因?

4

1 回答 1

43

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

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

    int confusing(Overloaded); // <-- This line
};

指示的线是什么意思?如所写,这是一个名为的成员函数的声明,confusing它接受一个类型的对象Overloaded(其名称未在函数声明中指定)作为参数,并返回一个int. 如果 C++11 允许初始化程序使用括号,这将是模棱两可的,因为它也可能是一个int名为的类型的成员的定义,confusing它被初始化为数据成员的值Overloaded。(这与Most Vexing Parse的当前问题有关。)

通过要求大括号,消除了这种歧义:

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

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

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

希望这可以帮助!

于 2013-05-02T03:45:00.583 回答