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

Requirements for forward iterator iterator_traits::reference

我想弄清楚 forward_iterators' reference 类型的具体要求。在明显的情况下,您将有 value_type = T;reference = T&;。阅读关于前向迭代器要求的 cppreference page,我看到

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

std::vector<bool> 表明 "equivalent expression" 并不总是有效,因为它 returns 是一个代理对象:

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]中列举:

A class or pointer type X satisfies the requirements of a forward iterator if

  • X satisfies the requirements of an input iterator (24.2.3),
  • X satisfies the DefaultConstructible requirements (17.6.3.1),
  • if X is a mutable iterator, reference is a reference to T; if X is a const iterator, reference is a reference to const T,
  • [...]

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