前向迭代器iterator_traits::reference的要求

Requirements for forward iterator iterator_traits::reference

本文关键字:reference traits 迭代器 iterator      更新时间:2023-10-16

我正试图弄清楚forward_iterators的reference类型到底有什么要求。最明显的例子是value_type = T;reference = T&;。阅读关于前向迭代器需求的cppreference页面,我看到

Expression  Return      Equivalent expression
*i++        reference   value_type& temp=*i; ++i; return temp;

std::vector<bool>显示"等效表达式"并不总是有效的,因为它返回一个代理对象:

std::vector<bool> v(10);
auto i = v.begin();
std::vector<bool>::iterator::value_type& temp = *i; // error
// can't bind bool& to std::_Bit_reference

等效表达式在我看到的标准中没有提到。代理对象允许分配,这可能是一致性的关键。

除了试图确定需求之外,我的具体问题是知道value_type == reference是否既不是引用也不是支持赋值,将与标准库一起工作。

一些Container<int>iterator标记为forward_iterator_tagreference == int是有效的吗?

需求在[forward.iterators]中枚举:

类或指针类型X满足前向迭代器的要求,如果

  • X满足输入迭代器(24.2.3)的要求,
  • X满足DefaultConstructible要求(17.6.3.1),
  • 如果X是可变迭代器,则reference是对T的引用;如果X是const迭代器,reference就是引用到const T
  • […]

所以如果你的容器有reference == int,那么它不符合前向迭代器的要求。我想从技术上讲,vector<bool>::iterator只是一个输入迭代器,尽管它被标记为随机访问迭代器。

相关文章: