编译器的大括号初始值设定项列表与类型"std::initializer_list"的耦合程度如何?

How tightly coupled is the compiler's brace-initializer-list to the type `std::initializer_list`?

本文关键字:initializer std 耦合 程度如 类型 list 列表 编译器      更新时间:2023-10-16

如果没有C++头<initializer_list>,我能达到同样的效果吗?

class initializer_list必须存在于namespace std中吗(编译器需要这样做吗)?

我对适用于五大(GCC、MSVC、Intel、Clang、Comeau)的解决方案很满意

它按照标准紧密耦合。它是一个围绕编译器构建的数组的包装器(尽管标准没有说明精确程度——GCC使用带指针和大小的构造函数,MSVC使用带两点的构造函数)。是的,它必须位于名称空间std和标头<initializer_list>中。

你必须看看他们在每个编译器中使用了什么构造函数,你想在你的版本中支持和复制它们,但TBH,我看不出这一点。

模板std::initializer_list未预先定义;如果在使用std::initializer_list之前不包括报头<initializer_list>——即使是未命名类型的隐式使用(7.1.6.4)——则程序是格式错误的。

std::initializer_list<E>类型的对象是从初始化器列表构造的,就好像实现分配了一个由N个E类型元素组成的数组,其中N是初始化器列表中的元素数。该数组的每个元素都是用初始化器列表的相应元素进行复制初始化的,并且std::initializer_list<E>对象被构造为引用该数组。