From cppreference.com
template<classI>conceptinput_or_output_iterator=requires(Ii){{*i}->/*can-reference*/;}&&std::weakly_incrementable<I>;(since C++20)The input_or_output_iterator concept forms the basis of the iterator concept taxonomy; every iterator type satisfies the input_or_output_iterator requirements.
The exposition-only concept /*can-reference*/ is satisfied if and only if the type is not (possibly cv-qualified) void.
Notes
input_or_output_iterator itself only specifies operations for dereferencing and incrementing an iterator. Most algorithms will require additional operations, for example:
comparing iterators with sentinels (see
);
reading values from an iterator (see
and
);
writing values to an iterator (see
and
);
a richer set of iterator movements (see
,
,
).
Unlike the
requirements, the input_or_output_iterator concept does not require copyability.
*i is required to be equality-preserving, although the increment operations required by
are not.
Example
A minimum iterator.
#include<cstddef>#include<iterator>structSimpleIterator{usingdifference_type=std::ptrdiff_t;intoperator*();SimpleIterator&operator++();voidoperator++(int){++*this;}};static_assert(std::input_or_output_iterator<SimpleIterator>);