initializer_list 是否被认为是 C++ 核心语言的一部分?

8

我问这个问题是因为 auto 推导出{}initializer_list。在标准库中,我不知道还有哪个类像这样对核心语言有依赖。你可以去掉 vector 或者 array,C++ 仍能正常运行,但如果去掉 initializer_list ,它就会崩溃。


向量、数组、初始化列表等都是 C++ STL 的一部分,它们都是类。 - ChrisMM
@ChrisMM 核心语言需要initializer_list,所以它不也是核心语言的一部分吗? - TwistedBlizzard
2
如果你所说的STL是指C++标准库,那么是的。但是,既然问题明确要求它是否是核心语言的一部分,我不明白它作为标准库类型与任何事情有关系。 - bitmask
1
核心语言和库类型之间有更多的重叠,例如 sizeof(x) 返回 std::size_t,typeof(x) 返回 std::type_info,dynamic_cast 可能会抛出 std::bad_cast 异常。更不用说像 is_constant_evaluated() 这样的“库”函数了。 - BoP
1个回答

5

{}(特别是= {...})被称为标准中的复制列表初始化

是的,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

1
可能需要提及的是,原始的{...}是一个花括号初始化列表 - NathanOliver
它的行为就像内置类型,但是它是库的一部分。更糟糕的是,没有rvalue支持,也没有constexperable(由于缺少方法实现)。这是C++类型系统中最糟糕的hack。 - Red.Wave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接