我问是因为auto
将{}
推导为initializer_list
。我不知道标准库中还有什么类是核心语言所依赖的。你可以去掉vector
或array
,C++仍然可以工作,但去掉initializer_list
,它就会坏掉。
您称之为{}
(特别是= {...}
)的标准调用复制列表初始化。
是的,std::initializer_list
在标准的措辞中得到了特殊考虑。
如果占位符类型说明符的形式为类型约束
auto
,则使用模板参数推导规则来确定替换T的推导类型T
。如果初始化是复制列表初始化,则std::initializer_list
的声明应在([basic.lookup.general])占位符类型说明符之前
[Example 1:
auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>
auto x2 = { 1, 2.0 }; // error: cannot deduce element type
auto x3{ 1, 2 }; // error: not a single element
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
auto x5{ 3 }; // decltype(x5) is int