为啥类内初始化器只能使用 = 或 ? [复制]

Posted

技术标签:

【中文标题】为啥类内初始化器只能使用 = 或 ? [复制]【英文标题】:Why can in-class initializers only use = or ? [duplicate]为什么类内初始化器只能使用 = 或 ? [复制] 【发布时间】:2013-05-02 03:39:31 【问题描述】:

In-class initializers(C++11 特性)必须用大括号括起来或跟在 = 符号后面。它们不能在括号内指定。

这是什么原因?

【问题讨论】:

【参考方案1】:

我对此不是 100% 肯定,但这可能是为了防止语法歧义。例如,考虑以下类:

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 confusingOverloaded; // <-- This line
;

现在,很明显confusing 实际上是一个int,初始化为Overloaded 的值,因为无法将它作为函数声明来读取。

希望这会有所帮助!

【讨论】:

这对我来说很有意义,但是我们已经在函数体中遇到了这种混淆。为什么这里应该不一样? @Rakete111 在函数体中,IIRC 因为最令人烦恼的解析语句 int confusing(Overloaded) 将被视为函数原型而不是变量声明,所以我认为行为是一致的。使用括号进行初始化是历史性的,新的基于大括号的初始化程序部分旨在避免旧语法的歧义。 没有歧义,在您描述的所有情况下,Overloaded 指的是int,并且不会发生令人烦恼的解析。这不能回答 IMO 的问题

以上是关于为啥类内初始化器只能使用 = 或 ? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++11 类内初始化程序不能使用括号?

c++11:为啥静态 constexpr 的类内初始化不是定义?

noobSTL-1-配置器-1

为啥类的常量数据成员需要在构造函数中初始化?

为啥只能在 C++ 类中初始化整数或枚举类型?

类内的按钮动作选择器