我问这个问题是因为 auto
推导出{}
是 initializer_list
。在标准库中,我不知道还有哪个类像这样对核心语言有依赖。你可以去掉 vector
或者 array
,C++ 仍能正常运行,但如果去掉 initializer_list
,它就会崩溃。
我问这个问题是因为 auto
推导出{}
是 initializer_list
。在标准库中,我不知道还有哪个类像这样对核心语言有依赖。你可以去掉 vector
或者 array
,C++ 仍能正常运行,但如果去掉 initializer_list
,它就会崩溃。
{}
(特别是= {...}
)被称为标准中的复制列表初始化。
是的,std::initializer_list
在标准措辞中得到了特殊考虑。
如果占位类型说明符的形式为类型约束
auto
,则使用模板参数推导规则确定替换T的推导类型T
。如果初始化是复制列表初始化,则应在([basic.lookup.general])占位类型说明符之前声明std::initializer_list
。
[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