为什么类内初始化器只能使用=或{}?
Why can in-class initializers only use = or {}?
类内初始化式(c++ 11的特性)必须用花括号括起来,或者跟在=号后面。不能在括号内指定。
这是什么原因?
我对此不是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
的值。(这与当前最令人烦恼的解析问题有关。)
通过使用花括号,消除了这种歧义:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing{Overloaded}; // <-- This line
};
现在,很明显confusing
实际上是一个初始化为Overloaded
值的int
,因为没有办法将其作为函数声明来读取。
希望这对你有帮助!
相关文章:
- 为什么在C++中首先初始化成员类
- (C++)为什么静态成员可以在初始化之前使用
- 为什么用结构初始化数组需要指定结构名称
- 为什么std::vector和std::valarray初始化构造函数不同
- 为什么这种直接初始化有效?(C++17)
- 为什么 zlib 放气初始化调用一次不起作用?
- 为什么C++常量模板化向量在使用之前没有初始化?
- 为什么C++有不同的变量初始化方式?
- 为什么除了继承聚合结构之外,结构为空,无法聚合初始化?
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- 为什么我在初始化带大括号的结构时出错?
- 为什么thread_local变量在这里从未初始化?
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- 为什么初始化时没有调用重载赋值运算符?
- 为什么通过指针编译时不能分配 const 初始化
- 为什么 gcc 会给我可能未初始化的警告 deque::insert 带有过滤范围
- 为什么我的 c++ 程序检查不是初始化的变量?
- 复制初始化:为什么即使关闭了复制省略,也没有调用move或copy构造函数
- 'goto label'跳过了'unused'的初始化 - 为什么我为 std::string 获取它而不是 int?