c – 为什么课堂初始化器只能使用=或{}?

前端之家收集整理的这篇文章主要介绍了c – 为什么课堂初始化器只能使用=或{}?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
In-class initializers(C 11功能)必须用大括号括起来或按照=符号.它们可能不在括号内指定.

这是什么原因?

解决方法

我对此不是100%肯定,但这可能是为了防止语法模糊.例如,考虑以下类:
class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal,but a very strange idea.

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

指示线是什么意思?如所写的,这是一个名为confused的成员函数的声明,它接受类型为Overloaded的对象(其名称函数声明中未指定)作为参数,并返回一个int.如果C 11允许初始化器使用括号,这将是不明确的,因为它也可以是int类型的成员的定义,名为confused,它被初始化为数据成员Overloaded的值. (这与Most Vexing Parse的当前问题有关)

通过要求花括号,这种歧义被删除

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

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

现在,很明显,混乱实际上是一个int初始化为Overloaded的值,因为没有办法把它看作一个函数声明.

希望这可以帮助!

猜你在找的C&C++相关文章