C++ named requirements: LegacyForwardIterator
A LegacyForwardIterator is a LegacyIterator that can read data from the pointed-to element.
If a LegacyForwardIterator it originates from a Container, then it's value_type is the same as the container's, so dereferencing (*it) obtains the container's value_type.
It satisfies LegacyForwardIterator if
- The type
- The type
- Objects of the type
Itprovide multipass guarantee described below
Tbe the value type of
It. The type std::iterator_traits<It>::reference must be either
T&&(since C++11) if
Itsatisfies LegacyOutputIterator (
Itis mutable), or
- const T& or const T&&(since C++11) otherwise (
Tis the type denoted by std::iterator_traits<It>::value_type)
- Equality and inequality comparison is defined over all iterators for the same underlying sequence and the value initialized-iterators(since C++14).
- i, dereferenceable lvalue of type
reference, the type denoted by std::iterator_traits<It>::reference
The following expressions must be valid and have their specified effects
|Expression||Return type||Equivalent expression|
||It ip = i; ++i; return ip;|
A mutable LegacyForwardIterator is a LegacyForwardIterator that additionally satisfies the LegacyOutputIterator requirements.
 Multipass guarantee
Given a and b, dereferenceable iterators of type
- If a and b compare equal (a == b is contextually convertible to true) then either they are both non-dereferenceable or *a and *b are references bound to the same object.
- If *a and *b refer to the same object, then a == b.
- Assignment through a mutable
ForwardIteratoriterator cannot invalidate the iterator (implicit due to
referencedefined as a true reference).
- Incrementing a copy of a does not change the value read from a (formally, either
Itis a raw pointer type or the expression (void)++It(a), *a is equivalent to the expression *a).
- a == b implies ++a == ++b.
Singular iteratorsA value-initialized LegacyForwardIterator behaves like the past-the-end iterator of some unspecified empty container: it compares equal to all value-initialized LegacyForwardIterators of the same type.
For the definition of std::iterator_traits, the following exposition-only concept is defined.
where the exposition-only concept
Unlike the std::forward_iterator concept, the LegacyForwardIterator requirements requires dereference to return a reference.
 Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
|DR||Applied to||Behavior as published||Correct behavior|
|C++98||the return type of *i++ did not match the return
type of *i-- required by LegacyBidirectionalIterator
|changed the return|
|C++98||'a == b implies ++a == ++b' alone
did not offer multipass guarantee
|also requires 'a == b|
implies ++a != b'
std::iter_reference_t<It> to be an lvalue reference type
|also allows rvalue reference types|
- In the scenario where a and b use the same underlying iterator, evaluating the expression ++a == ++b actually increments the underlying container twice, but the result is still true.
- Formally also requires implying ++b != a.
 See also
| specifies that an |
|Iterator library||provides definitions for iterators, iterator traits, adaptors, and utility functions|