The indirectly_writable concept specifies the requirements
for writing a value into an iterator's referenced object.
template<class Out, class T>conceptindirectly_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-preservingconst_cast<const iter_reference_t<Out>&&>(*o)=
std::forward<T>(t); // not required to be equality-preservingconst_cast<const iter_reference_t<Out>&&>(*std::forward<Out>(o))=
std::forward<T>(t); // not required to be equality-preserving};
If Out and T model
indirectly_readable<Out>&&same_as<iter_value_t<Out>, decay_t<T>>,
then *o after any above assignment is equal to
the value of E before the assignment.
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>.