前向迭代器的要求 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_tag
和 reference == 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
只是一个输入迭代器,即使它被标记为随机访问迭代器。
我想弄清楚 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_tag
和 reference == 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 toT
; ifX
is a const iterator, reference is a reference toconst T
,- [...]
所以如果你的容器有reference
== int
,那么就不符合前向迭代器的要求。我想这在技术上使 vector<bool>::iterator
只是一个输入迭代器,即使它被标记为随机访问迭代器。