c++ - iterator_traits<vector<bool>::iterator>::iterator_category 不应该是 input_iterator_tag 吗?

标签 c++ iterator type-traits stl-algorithm

我最近了解到ForwardIterator需要 operator *通过引用返回,这意味着迭代器 返回代理,例如 std::vector<bool> ,不能是ForwardIterator ([forward.iterators])。

但是,我测试了std::iterator_traits<std::vector<bool>::iterator>::iterator_category在不同的编译器中 ( G++ClangMSVC )和它 一直是std::random_access_iterator_tag 。是否符合上述要求?

最佳答案

不,事实并非如此。这是 vector<bool> 的大问题的一部分.

该标准自相矛盾。它说vector的迭代器是随机访问的,但定义 vector<bool>其迭代器不满足 RandomAccessIterator 的要求.

赫伯·萨特 (Herb Sutter) 的这篇古老论文解释了这一点和其他缺点:http://www.gotw.ca/publications/N1185.pdf

关于c++ - iterator_traits<vector<bool>::iterator>::iterator_category 不应该是 input_iterator_tag 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53738970/

相关文章:

c++ - 类定义和类声明

c++ - 这是静态多态性的 CRTP 用法,但没有实现派生函数。在 gcc 和 visual studio 中编译。为什么?

C++ 比较迭代器和 int

struct - 在不克隆的情况下将一个结构数组映射到Rust中的另一个结构数组

c# - HashSet 枚举器有什么作用?

c++ - 为什么这个 SFINAE 没有按预期工作?

C++ - 为包含字符串的类移动构造函数

c++ - 如何在 iOS 上的 QT/QML 中使用剪贴板

c++ - 使用 std::is_Detected_exact 检测运算符++签名

c++ - 重载一组类的加号运算符