Chr*_*erC 58 c++ initializer-list language-lawyer constexpr c++14
这是这个问题的后续问题:声明constexpr initializer_list对象是否合法?.
从C++ 14开始,std::initializer_list
该类的所有方法都标有constexpr
.能够通过执行来初始化实例似乎很自然,
constexpr std::initializer_list<int> list = {1, 2, 3};
但是Clang 3.5抱怨list
没有被常量表达式初始化.
正如dyp在评论中指出的那样,任何std::initializer_list
文字类型的要求似乎都从规范中消失了.
如果我们甚至不能将类完全定义为constexpr,那么有什么意义呢?这是标准中的疏忽,将来会得到修复吗?
标准委员会似乎打算initializer_list
成为文字类型.但是,它看起来并不是一个明确的要求,似乎是标准中的一个错误.
从§3.9.10.5开始:
类型是文字类型,如果它是:
- 具有以下所有属性的类类型(第9节):
- 它有一个简单的析构函数,
- 它是一个聚合类型(8.5.1)或者至少具有一个constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且
- 所有非静态数据成员和基类都是非易失性文字类型.
从§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 */
};
}
Run Code Online (Sandbox Code Playgroud)
这满足了第一和第二要求.
但是对于第三个要求:
从§18.9.2(强调我的):
类型的对象
initializer_list<E>
提供对类型对象数组的访问const E
.[注意:一对指针或一个指针加上一个长度将是明显的表示initializer_list
.initializer_list
用于实现8.5.4中指定的初始化列表.复制初始化列表不会复制基础元素.
- 尾注]
因此,不要求实现的私有成员是initializer_list
非易失性文字类型; 然而,因为他们提到他们相信一对指针或一个指针和一个长度将是"明显的代表",他们可能不会认为有人可能会把非文字的东西放在其中initializer_list
.
我会说这可能是铿锵声和标准中的错误.
归档时间: |
|
查看次数: |
2635 次 |
最近记录: |