# std::input_or_output_iterator

From cppreference.com
< cpp‎ | iterator

Defined in header `<iterator>` |  |
template <class I> concept input_or_output_iterator = requires(I i) { { *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 referenceable (in particular, not void).

### Equality preservation

Expressions declared in requires-expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).

### 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 `sentinel_for`);
- reading values from an iterator (see `indirectly_readable` and `input_iterator`)
- writing values to an iterator (see `indirectly_writable` and `output_iterator`)
- a richer set of iterator movements (see `forward_iterator`, `bidirectional_iterator`, `random_access_iterator`)

Unlike the LegacyIterator requirements, the `input_or_output_iterator` concept does not require copyability.

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/iterator/input_or_output_iterator&oldid=135346"