【发布时间】:2015-10-18 16:48:00
【问题描述】:
在 §5.2[expr.post]/1 我们有 expression-list
的定义表达式列表:
初始化列表
为什么我们需要这两个定义?
在 §8.5[dcl.init]/1 我们有:
支撑初始化列表:
{ 初始化列表,opt }
{ }
为什么我们需要上面可选的,?
注意这个 sn-p 编译:
struct A{
int i;
float f;
A(int i, float f) : i(i), f(f) {}
};
int main()
{
A a = { 1, 2., };
}
【问题讨论】:
-
第二个问题已经在别处得到解答(由 Jon Skeet 本人 IIRC)
-
其他地方是here
-
花括号初始化列表中的逗号来自 C,当您 a) 生成带有某些内容的列表 b) 当您将列表分布在多行并且想要添加时,它们很有用一个项目或对列表进行排序。统一性有助于简化编辑任务。
-
@chris 感谢您的链接
-
第一个可能是出于历史原因。在 C++03 中,expression-list 实际上是一个逗号分隔的 assignment-expression 列表。然后在 C++11 中,他们希望也允许使用大括号初始化器,并且与跨标准进行手术相比,更改 expression-list 的产生可能更简单且不易出错。
标签: c++ grammar language-lawyer c++14