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允许初始化程序使用括号,则这将是模棱两可的,因为它也可能是名为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
,因为无法将其作为函数声明读取。希望这可以帮助!