[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]).