25 Iterators library [iterators]

25.3 Iterator requirements [iterator.requirements]

25.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, where the meaning of iter_move is established as-if by performing argument-dependent lookup only ([basic.lookup.argdep]).
  • 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.