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

27

类内初始化(C++11 特性)必须用花括号括起来或者跟在等号后面。它们不能在括号中指定。

为什么要这样做呢?

1个回答

42

我不完全确定,但这可能是为了防止语法歧义。例如,请考虑以下类:

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

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

所示行是什么意思?按照书写方式,这是一个名为confusing的成员函数声明,它接受一个未在函数声明中指定名称的类型为Overloaded的对象作为参数,并返回一个int。如果C++11允许初始化程序使用括号,这将是有歧义的,因为它也可以是一个名为confusingint类型成员的定义,它被初始化为数据成员Overloaded的值。(这与当前Most Vexing Parse问题有关。)
通过要求使用花括号,消除了这种歧义:
class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal, but a very strange idea.

    int confusing{Overloaded}; // <-- This line
};

现在很明显,“confusing”实际上是一个被初始化为“Overloaded”值的“int”,因为没有办法将其解读为函数声明。
希望这有所帮助!

1
这对我来说很有道理,但是我们在函数体中已经有了这种混淆的情况。为什么这里应该不同呢? - Rakete1111
在函数体中,据我所知,由于最令人困惑的解析(Most Vexing Parse),语句int confusing(Overloaded)将被视为函数原型而不是变量声明,因此我认为行为是一致的。使用括号进行初始化是历史悠久的,而新的基于大括号的初始化器部分是为了避免旧语法的歧义而设计的。 - templatetypedef
在你描述的所有情况中,Overloaded 都指的是 int,没有出现任何令人烦恼的解析歧义。但这并不回答问题。 - Passer By

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接