gpt4 book ai didi

c++ - 为什么不将 `std::initializer_list` 定义为文字类型?

转载 作者:IT老高 更新时间:2023-10-28 13:23:53 26 4
gpt4 key购买 nike

这是这个问题的后续: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没有被常量表达式初始化。 As dyp pointed out in a comment , 对 std::initializer_list 的任何要求作为一种文字类型似乎已经从规范中消失了。

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

最佳答案

标准委员会似乎打算 initializer_list作为文字类型。但是,它看起来并不是一个明确的要求,而且似乎是标准中的一个错误。

从第 3.9.10.5 节开始:

A type is a literal type if it is:
- a class type (Clause 9) that has all of the following properties:
- - it has a trivial destructor,
- - it is an aggregate type (8.5.1) or has at least one constexpr constructor or constructor template that is not a copy or move constructor, and
- - all of its non-static data members and base classes are of non-volatile literal 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 节(强调我的):

An object of type initializer_list<E> provides access to an array of objects of type const E. [Note: A pair of pointers or a pointer plus a length would be obvious representations for initializer_list. initializer_list is used to implement initializer lists as specified in 8.5.4. Copying an initializer list does not copy the underlying elements.
—end note]

所以initializer_list的实现不需要私有(private)成员是非 volatile 文字类型;然而,因为他们提到他们相信一对指针或一个指针和一个长度将是“明显的表示”,他们可能没有考虑到有人可能会在 initializer_list 的成员中放入非文字内容。 .

我会说这可能是 clang 和标准中的一个错误。

关于c++ - 为什么不将 `std::initializer_list` 定义为文字类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27496004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com