这是这个问题的后续:声明 constexprinitializer_list 对象是否合法? https://stackoverflow.com/questions/16063123/is-it-legal-to-declare-a-constexpr-initializer-list-object.
从 C++14 开始,std::initializer_list
类的所有方法都标记为constexpr
。通过执行以下操作来初始化实例似乎很自然constexpr std::initializer_list<int> list = {1, 2, 3};
但 Clang 3.5 抱怨list
没有被常量表达式初始化。正如 dyp 在评论中指出的那样 https://stackoverflow.com/questions/16063123/is-it-legal-to-declare-a-constexpr-initializer-list-object#comment43416424_16067393, 任何要求std::initializer_list
作为文字类型似乎已经从规范中消失了。
如果我们甚至无法将一个类完全定义为 constexpr,那么它有什么意义呢?这是标准中的疏忽吗?将来会得到修复吗?
标准委员会似乎打算initializer_list
是文字类型。然而,它看起来并不是一个明确的要求,而且似乎是标准中的一个错误。
从第 3.9.10.5 节开始:
类型是一个文字类型如果是:
- 具有以下所有属性的类类型(第 9 条):
- - 它有一个简单的析构函数,
- - 它是一种聚合类型(8.5.1)或至少有一个常量表达式构造函数或构造函数模板不是复制或移动构造函数,并且
- - 它的所有非静态数据成员和基类都是非易失性文字类型。
从第 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(强调我的):
类型的对象initializer_list<E>
提供对类型对象数组的访问const E
。 [笔记:一对指针或一个指针加一个长度将是明显的表示initializer_list
. initializer_list
用于实现 8.5.4 中指定的初始值设定项列表。复制初始值设定项列表不会复制基础元素。
——尾注]
所以没有要求私有成员执行initializer_list
是非易失性文字类型;然而,因为他们提到他们相信一对指针或一个指针和一个长度将是“明显的表示”,所以他们可能没有考虑到有人可能会在成员中放入非文字的东西initializer_list
.
我想说这可能是 clang 和标准中的一个错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)