The Writable concept specifies the requirements for writing a value into an iterator's referenced object.
template <class Out, class T> concept bool Writable = requires(Out&& o, T&& t) { *o = std::forward<T>(t); // not required to be equality preserving *std::forward<Out>(o) = std::forward<T>(t); // not required to be equality preserving const_cast<const reference_t<Out>&&>(*o) = std::forward<T>(t); // not required to be equality preserving const_cast<const reference_t<Out>&&>(*std::forward<Out>(o)) = std::forward<T>(t); // not required to be equality preserving };
Let E be an an expression such that decltype((E)) is T, and let o be a dereferenceable object of type Out. Writable<Out, T> is satisfied only if
If Readable<Out> && Same<value_type_t<Out>, decay_t<T>> is satisfied, 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 ( ISO/IEC 14882:2014 §[basic.lval]), the resulting state of the object it denotes is valid but unspecified ( ISO/IEC 14882:2014 §[lib.types.movedfrom]).
[ Note: The only valid use of an operator* is on the left side of the assignment statement. Assignment through the same value of the writable type happens only once. — end note ]