This concept refines std::input_iterator by requiring that I
also model
std::incrementable
Iterator concept determination
Definition of this concept is specified via an exposition-only alias template /*ITER_CONCEPT*/.
In order to determine /*ITER_CONCEPT*/<I>, let ITER_TRAITS<I> denote I if the specialization
std::iterator_traits<I>
is generated from the primary template, or std::iterator_traits<I>
- If ITER_TRAITS<I>::iterator_concept is valid and names a type, /*ITER_CONCEPT*/<I>
- Otherwise, if ITER_TRAITS<I>::iterator_category is valid and names a type, /*ITER_CONCEPT*/<I>
- Otherwise, if
std::iterator_traits<I>
is generated from the primary template, /*ITER_CONCEPT*/<I> denotes std::random_access_iterator_tag
- Otherwise, /*ITER_CONCEPT*/<I>
Semantic requirements
I
models std::forward_iterator
if, and only if I
models all the concepts it subsumes, and given objects i and j of type I
- Comparison between iterators i and j has a defined result if
-
- i and j are iterators to the same underlying sequence, or
- both i and j are value-initialized, in which case they compare equal.
- Pointers and references obtained from a forward iterator into a range remain valid while the range exists.
- If i and j are dereferenceable, they offer the multi-pass guarantee, that is:
-
-
i == j implies ++i == ++j
-
(
(
void
)
[
]
(
auto x)
{
++x;
}
(i), *i)
is equivalent to *i
Notes
Unlike the LegacyForwardIterator requirements, the forward_iterator
Example
A minimum forward iterator.
#include <cstddef>
#include <iterator>
struct SimpleForwardIterator
{
using difference_type = std::ptrdiff_t;
using value_type = int;
int operator*() const;
SimpleForwardIterator& operator++();
SimpleForwardIterator operator++(int)
{
auto tmp = *this;
++*this;
return tmp;
}
bool operator==(const SimpleForwardIterator&) const;
};
static_assert(std::forward_iterator<SimpleForwardIterator>);
See also
|
specifies that a type is an input iterator, that is, its referenced values can be read and it can be both pre- and post-incremented (concept) |
|
specifies that a forward_iterator is a bidirectional iterator, supporting movement backwards (concept) |