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