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

时间:2013-05-02 03:39:32

标签: c++ c++11 initializer curly-braces

In-class initializers(C ++ 11特性)必须用大括号括起来或跟在=符号后面。它们可能未在括号内指定。

这是什么原因?

1 个答案:

答案 0 :(得分:35)

我对此并非100%肯定,但这可能是为了防止语法模糊。例如,请考虑以下类:

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

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

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

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

confusing

现在,很明显Overloaded实际上是class BadTimes { struct Overloaded; int Overloaded; // Legal, but a very strange idea. int confusing{Overloaded}; // <-- This line }; 初始化为confusing的值,因为无法将其作为函数声明读取。

希望这有帮助!