[alg.req.ind.move] (original) (raw)
23 Iterators library [iterators]
23.3 Iterator requirements [iterator.requirements]
23.3.7 Common algorithm requirements [alg.req]
23.3.7.2 Concept indirectly_movable [alg.req.ind.move]
The indirectly_movable concept specifies the relationship between a indirectly_readable type and a indirectly_writable type between which values may be moved.
template<class In, class Out> concept indirectly_movable = indirectly_readable && indirectly_writable<Out, iter_rvalue_reference_t>;
The indirectly_movable_storable concept augmentsindirectly_movable with additional requirements enabling the transfer to be performed through an intermediate object of theindirectly_readable type's value type.
template<class In, class Out> concept indirectly_movable_storable = indirectly_movable<In, Out> && indirectly_writable<Out, iter_value_t> && movable<iter_value_t> && constructible_from<iter_value_t, iter_rvalue_reference_t> && assignable_from<iter_value_t&, iter_rvalue_reference_t>;
Let i be a dereferenceable value of type In.
In and Out model indirectly_movable_storable<In, Out>only if after the initialization of the object obj in
iter_value_t obj(ranges::iter_move(i));
obj is equal to the value previously denoted by *i.
Ifiter_rvalue_reference_t<In> is an rvalue reference type, the resulting state of the value denoted by *i is valid but unspecified ([lib.types.movedfrom]).