【发布时间】:2013-04-26 03:33:34
【问题描述】:
【问题讨论】:
标签: c++ c++11 initializer curly-braces
【问题讨论】:
标签: c++ c++11 initializer curly-braces
我对此不是 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 的值,因为无法将它作为函数声明来读取。
希望这会有所帮助!
【讨论】:
int confusing(Overloaded) 将被视为函数原型而不是变量声明,所以我认为行为是一致的。使用括号进行初始化是历史性的,新的基于大括号的初始化程序部分旨在避免旧语法的歧义。
Overloaded 指的是int,并且不会发生令人烦恼的解析。这不能回答 IMO 的问题