为什么不把`std :: initializer_list`定义为文字types?

这是这个问题的一个后续问题: 声明一个constexpr的initializer_list对象是否合法? 。

自C ++ 14以来, std::initializer_list类的所有方法都用constexpr标记。 用constexpr std::initializer_list<int> list = {1, 2, 3};来初始化一个实例是很自然的constexpr std::initializer_list<int> list = {1, 2, 3}; 但Clang 3.5抱怨list没有被一个常量expression式初始化。 正如在注释中指出的 , std::initializer_list是一个字面types的任何要求似乎已经从规格中消失。

如果我们甚至不能初始化它,那么将一个类定义为constexpr有什么意义呢? 这是标准中的一个疏忽,将在未来得到修复吗?

标准委员会似乎打算initializer_list是一个文字types。 但是,它看起来不是一个明确的要求,而且似乎是标准中的一个缺陷。

从§3.9.10.5:

一个types是一个文字types,如果它是:
– 具有以下所有属性的类types(第9章):
– 它有一个微不足道的析构函数,
– 它是一个聚合types(8.5.1),或者至less有一个不是复制或移动构造函数的constexpr构造函数或构造函数模板,
– 它的所有非静态数据成员和基类都是非易失性字面types。

从§18.9.1:

 namespace std { template<class E> class initializer_list { public: /* code removed */ constexpr initializer_list() noexcept; // No destructor given, so trivial /* code removed */ }; } 

这满足了第一个和第二个要求。

对于第三个要求:

从§18.9.2(重点是我的):

types为initializer_list<E>的对象提供对types为const E的对象数组的访问。 [注意: 一对指针或一个指针加上一个长度将是initializer_list显而易见的表示。 initializer_list用于实现8.5.4中规定的初始化器列表。 复制初始化程序列表不会复制基础元素。
– 注意]

所以不需要执行initializer_list的私有成员为非易失性字面types; 然而,因为他们提到他们认为一对指针或一个指针和一个长度将是“明显的表示”,他们可能不认为有人可能会把一些非文字的东西放在initializer_list的成员中。

我想说,这可能是一个叮当和标准的错误。