【发布时间】:2013-06-14 09:57:01
【问题描述】:
在 SO 上已经有一个类似的 question,但我想强调 braced-init-lists 的另一个方面。考虑以下几点:
auto x = {1}; //(1)
除非包含标题 <initializer_list>,否则这是格式错误的 (8.5.4/2)。但为什么?标准说,模板std::initializer_list 没有预定义。这是否意味着声明 (1) 引入了一种新类型?在所有其他情况下,可以使用auto,例如
auto y = expr;
其中expr 是一个表达式,自动推导的类型已经存在。另一方面,从逻辑的角度来看,编译器必须为构造{1} 分配一个隐式类型,而std::initializer_list 则是另一个名称。但在声明 (1) 中,我们不想命名这种类型。那么为什么必须包含此标头。 nullptr 也有类似的情况。它的类型隐含存在,但要明确命名,您必须包含<cstddef>。
【问题讨论】:
-
auto x = {expr};将根据语言规则将x推断为std::initializer_list类型 - 所以需要#include <initializer_list>。
标签: c++ c++11 types auto initializer-list