类内初始化(C++11 特性)必须用花括号括起来或者跟在等号后面。它们不能在括号中指定。
为什么要这样做呢?
我不完全确定,但这可能是为了防止语法歧义。例如,请考虑以下类:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing(Overloaded); // <-- This line
};
confusing
的成员函数声明,它接受一个未在函数声明中指定名称的类型为Overloaded
的对象作为参数,并返回一个int
。如果C++11允许初始化程序使用括号,这将是有歧义的,因为它也可以是一个名为confusing
的int
类型成员的定义,它被初始化为数据成员Overloaded
的值。(这与当前Most Vexing Parse问题有关。)class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing{Overloaded}; // <-- This line
};
int confusing(Overloaded)
将被视为函数原型而不是变量声明,因此我认为行为是一致的。使用括号进行初始化是历史悠久的,而新的基于大括号的初始化器部分是为了避免旧语法的歧义而设计的。 - templatetypedefOverloaded
都指的是int
,没有出现任何令人烦恼的解析歧义。但这并不回答问题。 - Passer By