23 Iterators library [iterators]

23.3 Iterator requirements [iterator.requirements]

23.3.7 Common algorithm requirements [alg.req]

23.3.7.3 Concept indirectly_­copyable [alg.req.ind.copy]

The indirectly_­copyable concept specifies the relationship between a readable type and a writable type between which values may be copied.
template<class In, class Out>
  concept indirectly_copyable =
    readable<In> &&
    writable<Out, iter_reference_t<In>>;
The indirectly_­copyable_­storable concept augments indirectly_­copyable with additional requirements enabling the transfer to be performed through an intermediate object of the readable type's value type.
It also requires the capability to make copies of values.
template<class In, class Out>
  concept indirectly_copyable_storable =
    indirectly_copyable<In, Out> &&
    writable<Out, const iter_value_t<In>&> &&
    copyable<iter_value_t<In>> &&
    constructible_from<iter_value_t<In>, iter_reference_t<In>> &&
    assignable_from<iter_value_t<In>&, iter_reference_t<In>>;
Let i be a dereferenceable value of type In.
In and Out model indirectly_­copyable_­storable<In, Out> only if after the initialization of the object obj in
iter_value_t<In> obj(*i);
obj is equal to the value previously denoted by *i.
If iter_­reference_­t<In> is an rvalue reference type, the resulting state of the value denoted by *i is valid but unspecified ([lib.types.movedfrom]).