Defined in header <iterator> | ||
---|---|---|
template <class I, class T> concept output_iterator = std::input_or_output_iterator<I> && std::indirectly_writable<I, T> && requires(I i, T&& t) { *i++ = std::forward<T>(t); // not required to be equality-preserving }; | (since C++20) |
The output_iterator
concept is a refinement of input_or_output_iterator
, adding the requirement that it can be used to write values of type and value category encoded by T
(via indirectly_writable
). equality_comparable
is not required.
Let E
be an expression such that decltype((E))
is T
, and i
be a dereferenceable object of type I
. output_iterator<I, T>
is modeled only if all the concepts it subsumes are modeled, and *i++ = E;
has effects equivalent to *i = E; ++i;
.
An expression is equality preserving if it results in equal outputs given equal inputs.
In specification of standard concepts, operands are defined as the largest subexpressions that include only:
std::move
, std::forward
, and std::declval
. The cv-qualification and value category of each operand is determined by assuming that each template type parameter denotes a cv-unqualified complete non-array object type.
Every expression required to be equality preserving is further required to be stable: two evaluations of such an expression with the same input objects must have equal outputs absent any explicit intervening modification of those input objects.
Unlike the LegacyOutputIterator requirements, the output_iterator
concept does not require that the iterator category tag be defined.
Algorithms on output iterators should be single pass.
(C++20) | specifies that objects of a type can be incremented and dereferenced (concept) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/output_iterator