为什么 ConstexprIterator 不是来自 std::array bidirectional/random-access?

Why isn't ConstexprIterator from std::array bidirectional/random-access?

我有一个适用于任意容器的库函数。基本上它打印元素。对于 bidirectional/random-access 容器,它首先打印和最后打印,仅首先打印单向。识别和使用双向性取决于工作 --container.end()。这适用于 C++17 中的 std::array,但在 C++20 中 std::array 具有 ConstexprIterator 而不是 LegacyRandomAccessIterator。 看了https://en.cppreference.com/w/cpp/named_req/ConstexprIterator好像ConstexprIterator真的没有operator--反而和猫有关???

所以我的问题是:为什么 ConstexprIterator 不是随机访问或至少是双向的?我的意思是,如果它在编译时工作,那么它真的应该是随机访问的。

So my question is: WHY isn't ConstexprIterator random access or at least bidirectional?

因为这会阻止非随机访问或双向的迭代器成为 constexpr 迭代器。这种限制是不可取的。

这类似于 可变迭代器常量迭代器 均不限于特定迭代器类别。这些是可以应用于 any 类别的迭代器的附加概念。

Reading https://en.cppreference.com/w/cpp/named_req/ConstexprIterator it seems that ConstexprIterator really doesn't have operator--

不管链接页面是否已过时(以及 non-normative 来源),这实际上是正确的。 constexpr 迭代器 不一定有运算符--.

Why ConstexprIterator from std::array isn't bidirectional/random access?

随机访问。标准说(最新草案):

[array.overview]

The header defines a class template for storing fixed-size sequences of objects. An array is a contiguous container.

[container.requirements.general]

A contiguous container is a container whose member types iterator and const_­iterator meet the Cpp17RandomAccessIterator requirements ([random.access.iterators]) and model contiguous_­iterator ([iterator.concept.contiguous]).

in c++20 std::array has ConstexprIterator instead of LegacyRandomAccessIterator

不是“代替”。

https://en.cppreference.com/w/cpp/container/array (bold mine)

iteratorLegacyRandomAccessIterator and ConstexprIterator (since C++20) that is a LiteralType (since C++17)


WHY isn't ConstexprIterator random access or at least bidirectional

除了 ConstexprIterator.

之外,迭代器还可以有任何迭代器类别

ConstexprIterator 要求类别所需的所有操作(迭代器声称符合)在 compile-time 工作,仅此而已。

喵!