关于 SO已经有一个类似的问题,但我想强调braced-init-lists 的另一个方面。考虑以下:
auto x = {1}; //(1)
除非包含标题,否则这是格式错误的 (8.5.4/2) <initializer_list>
。但为什么?标准说,模板std::initializer_list
不是预定义的。这是否意味着声明 (1) 引入了一种新类型?在所有其他情况下,auto
可以使用的地方,例如
auto y = expr;
whereexpr
是一个表达式,自动推导的类型已经存在。另一方面,从逻辑的角度来看,编译器必须为构造分配一个隐式类型{1}
,std::initializer_list
然后是另一个名称。但在声明 (1) 中,我们不想命名这种类型。那么为什么必须包含此标头。也有类似的情况nullptr
。它的类型隐含存在,但要明确命名它,您必须包含<cstddef>
.