微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

enter image description here

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

解决方法

在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迭代器。这样的限制是不希望的。

这类似于可变迭代器常量迭代器都不限于某些迭代器类别。这些是可以应用于 any 类别的迭代器的其他概念。

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

不管链接页面是否过时(和非规范性来源),实际上都是如此。 constexpr迭代器不一定具有运算符-。

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

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

[array.overview]

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

[container.requirements.general]

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。