STL独立初始化列表

STL independent initializer list

我对初始化列表有点困惑。

我认为初始化列表是 C++ 的一部分:

struct Something { char c0, c1; };

Something something = { 'H', 'W' };

类比数组等。还有一些东西(在我看来)与 STL(在 header <initializer_list> 中)有关,称为 std::initializer_list<T>,它与初始化列表相匹配,例如方法参数等

std::initializer_list<char> list = { 'H', 'e', 'l', 'l', 'o' };

现在我的困惑:

auto match = { 'H', 'e', 'l', 'l', 'o' };

当我看什么是 auto 解释(在 MSVC 2015 中)时,它是 std::initializer_list<char>

所以我的问题是:

C++ 语言和 STL 库之间的界线在哪里?

是否有一些指令指定应如何解释初始化列表(在 C++ 中的含义)?

可能会改变解释,例如从 std::initializer_list<T>T[]?

这是一个aggregate initialization

struct Something { char c0, c1; };
Something something = { 'H', 'W' };

Where is the line between C++ language and STL library?

这并不是 C++ 语言STL 库 之间的区别,因为标准库本身是用 C++ 编写的(它不将它们视为两个独立的实体是有意义的)。要点在于区分您正在初始化的元素类型以及可用的构造函数。

大多数混淆源于这样一个事实,即提案和缺陷报告激起了关于如何解释大括号初始化的相当多的争论(也参见 Scott Meyers articles, some of them have been recently discussed)。

Is there some directive specifying how should be initializer list (in C++ meaning) interpreted?

理解它的唯一正确方法是能够识别您正在使用的类型并理解 C++ standard 指令(根据您正在使用的 C++ 版本和编译器支持)。

答案部分基于 MSDN thread

Where is the line between C++ language and STL library?

标准库和纯 C++ 之间的界限有点​​嘈杂。 它位于称为 LSL 的图书馆的一部分,语言支持图书馆。 该行存在于以下示例中: Allocation returns std::bad_alloc. 因此,从 c++ 语言的角度来看,std::bad_alloc 可以使用直接分配来抑制 std::bad_alloc OSAPI。 与 std::size_t、std::nullptr_t 等类似...

在下面的例子中,这条线,如果存在的话,是有噪音的:dynamic_cast throws std::bad_cast. 不可分割性 LSL 和 C++ 的类似示例是初始化列表。

Is there some directive specifying how should be initializer list (in C++ meaning) interpreted?

指令作为语言规范存在,指令作为一种#pragma 指令或任何可以简单改变的东西不存在。

Could be interpretation changed e.g. from std::initializer_list into T[]?

在 MSVC 中,没有。可能无处可去。