Mat*_*szL 7 c++ iterator constexpr
我有一个适用于任意容器的库函数。基本上它打印元素。对于双向/随机访问容器,它首先打印和最后打印,仅首先打印单向。识别和使用双向性取决于工作--container.end()。这std::array在 C++17 中有效,但在 C++20std::array中ConstexprIterator代替了LegacyRandomAccessIterator. 阅读https://en.cppreference.com/w/cpp/named_req/ConstexprIterator似乎ConstexprIterator真的没有operator--,而是与猫有关???
所以我的问题是:为什么不是ConstexprIterator随机访问或至少是双向的?我的意思是,如果它在编译时工作,那么它真的应该是随机访问的。
Hol*_*Cat 11
在 c++20 中
std::array有ConstexprIterator而不是LegacyRandomAccessIterator
不是“代替”。
https://en.cppreference.com/w/cpp/container/array(粗体我的)
iterator— LegacyRandomAccessIterator 和 ConstexprIterator (C++20 起),它是LiteralType (C++17 起)
为什么不是ConstexprIterator随机访问或至少是双向的
除了ConstexprIterator之外,迭代器还可以具有任何迭代器类别。
ConstexprIterator要求类别(迭代器声称符合的)所需的所有操作都在编译时工作,仅此而已。
喵!
所以我的问题是:为什么 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])的容器。