类内初始化器(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
,因为没有办法将它作为函数声明来读取。
希望这可以帮助!