In-class initializers(C ++ 11特性)必须用大括号括起来或跟在=符号后面。它们可能未在括号内指定。
这是什么原因?
答案 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
的值,因为无法将其作为函数声明读取。
希望这有帮助!