【问题标题】:Why can in-class initializers only use = or {}? [duplicate]为什么类内初始化器只能使用 = 或 {}? [复制]
【发布时间】:2013-04-26 03:33:34
【问题描述】:

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

这是什么原因?

【问题讨论】:

    标签: c++ c++11 initializer curly-braces


    【解决方案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 confusing{Overloaded}; // <-- This line
    };
    

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

    希望这会有所帮助!

    【讨论】:

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