3.7 KiB
[iterator.concept.writable]
24 Iterators library [iterators]
24.3 Iterator requirements [iterator.requirements]
24.3.4 Iterator concepts [iterator.concepts]
24.3.4.3 Concept indirectly_writable [iterator.concept.writable]
The indirectly_writable concept specifies the requirements for writing a value into an iterator's referenced object.
template<class Out, class T>concept indirectly_writable =requires(Out&& o, T&& t) {o = std::forward(t); // not required to be equality-preservingstd::forward(o) = std::forward(t); // not required to be equality-preservingconst_cast<const iter_reference_t&&>(*o) = std::forward(t); // not required to be equality-preservingconst_cast<const iter_reference_t&&>(*std::forward(o)) = std::forward(t); // not required to be equality-preserving};
Let E be an expression such that decltype((E)) is T, and let o be a dereferenceable object of type Out.
Out and T model indirectly_writable<Out, T> only if:
If Out and T model indirectly_readable && same_as<iter_value_t, decay_t>, then *o after any above assignment is equal to the value of E before the assignment.
After evaluating any above assignment expression, o is not required to be dereferenceable.
If E is an xvalue ([basic.lval]), the resulting state of the object it denotes is valid but unspecified ([lib.types.movedfrom]).
[Note 1:
The only valid use of an operator* is on the left side of the assignment statement.
Assignment through the same value of the indirectly writable type happens only once.
â end note]
[Note 2:
indirectly_writable has the awkward const_cast expressions to reject iterators with prvalue non-proxy reference types that permit rvalue assignment but do not also permit const rvalue assignment.
Consequently, an iterator type I that returns std::string by value does not model indirectly_writable<I, std::string>.
â end note]