23 Iterators library [iterators]

23.3 Iterator requirements [iterator.requirements]

23.3.3 Customization point objects [iterator.cust] ranges​::​iter_­move [iterator.cust.move]

The name ranges​::​iter_­move denotes a customization point object ([customization.point.object]).
The expression ranges​::​iter_­move(E) for a subexpression E is expression-equivalent to:
  • iter_­move(E), if E has class or enumeration type and iter_­move(E) is a well-formed expression when treated as an unevaluated operand, with overload resolution performed in a context that does not include a declaration of ranges​::​iter_­move but does include the declaration void iter_move();
  • Otherwise, if the expression *E is well-formed:
  • Otherwise, ranges​::​iter_­move(E) is ill-formed.
    [Note 1:
    This case can result in substitution failure when ranges​::​iter_­move(E) appears in the immediate context of a template instantiation.
    — end note]
If ranges​::​iter_­move(E) is not equal to *E, the program is ill-formed, no diagnostic required.