为什么不是来自 std::array 双向/随机访问的 ConstexprIterator?

Mat*_*szL 7 c++ iterator constexpr

我有一个适用于任意容器的库函数。基本上它打印元素。对于双向/随机访问容器,它首先打印和最后打印,仅首先打印单向。识别和使用双向性取决于工作--container.end()。这std::array在 C++17 中有效,但在 C++20std::arrayConstexprIterator代替了LegacyRandomAccessIterator. 阅读https://en.cppreference.com/w/cpp/named_req/ConstexprIterator似乎ConstexprIterator真的没有operator--,而是与猫有关???

在此处输入图片说明

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

Hol*_*Cat 11

在 c++20 中std::arrayConstexprIterator而不是LegacyRandomAccessIterator

不是“代替”。

https://en.cppreference.com/w/cpp/container/array(粗体我的)

iteratorLegacyRandomAccessIterator ConstexprIterator (C++20 起),它是LiteralType (C++17 起)


为什么不是ConstexprIterator随机访问或至少是双向的

除了ConstexprIterator之外,迭代器还可以具有任何迭代器类别。

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

喵!


eer*_*ika 6

所以我的问题是:为什么 ConstexprIterator 不是随机访问或至少是双向的?

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

这类似于可变迭代器常量迭代器都不限于某些迭代器类别。这些是可以应用于任何类别的迭代器的附加概念。

阅读https://en.cppreference.com/w/cpp/named_req/ConstexprIterator似乎 ConstexprIterator 确实没有运算符--

尽管链接页面已过时(和非规范来源),这实际上是正确的。一个constexpr迭代器不一定operator--。

为什么来自 std::array 的 ConstexprIterator 不是双向/随机访问?

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

[阵列概览]

头文件定义了一个类模板,用于存储固定大小的对象序列。数组是一个连续的容器。

[container.requirements.general]

连续容器是其成员类型 iterator 和 const_iterator 满足 Cpp17RandomAccessIterator 要求([random.access.iterators])和模型 contiguous_iterator([iterator.concept.contiguous])的容器。