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

问题描述:

In-class initializers(C++ 11功能)必须用大括号括起来或遵循=号。它们可能不在括号内指定。为什么类内初始值设定项只能使用=或{}?

,这是什么原因呢?

对此我不是百分百肯定的,但这可能是为了防止语法不明确。例如,请考虑以下课程:

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实际上是初始化为Overloaded值的int ,因为没有办法将它作为函数声明来读取。

希望这会有所帮助!

+1

你能否详细解释为什么'混淆'是定义而不是声明? **“这是一个名为混淆的成员函数的定义,它接受一个类型为Overloaded的对象作为参数**”。我有这个困惑,因为它应该是模糊的权利? – 2013-05-02 05:09:52

+1

@ Koushik-你说得对,那应该是宣言,而不是定义。让我解决这个问题... – templatetypedef 2013-05-02 05:34:52