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

Shouldn't iterator_traits<vector<bool>::iterator>::iterator_category be input_iterator_tag?

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

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

不,不是。这是 vector<bool>.

的大问题的一部分

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

的要求

Herb Sutter 的这篇古老论文解释了这个和其他缺点:http://www.gotw.ca/publications/N1185.pdf