[iterator.cust.move]

# 24 Iterators library [[iterators]](./#iterators)

## 24.3 Iterator requirements [[iterator.requirements]](iterator.requirements#iterator.cust.move)

### 24.3.3 Customization point objects [[iterator.cust]](iterator.cust#move)

#### 24.3.3.1 ranges​::​iter_move [iterator.cust.move]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L1149)

The name ranges​::​iter_move denotes
a customization point object ([[customization.point.object]](customization.point.object "16.3.3.3.5 Customization Point Object types"))[.](#1.sentence-1)

The expression ranges​::​iter_move(E) for a subexpression E is
expression-equivalent to:

- [(1.1)](#1.1)

  iter_move(E), ifE has class or enumeration type anditer_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]](basic.lookup.argdep "6.5.4 Argument-dependent name lookup"))[.](#1.1.sentence-1)

- [(1.2)](#1.2)

  Otherwise, if the expression *E is well-formed:
  * [(1.2.1)](#1.2.1)

if *E is an lvalue, std​::​move(*E);

  * [(1.2.2)](#1.2.2)

otherwise, *E[.](#1.2.sentence-1)

- [(1.3)](#1.3)

  Otherwise, ranges​::​iter_move(E) is ill-formed[.](#1.3.sentence-1)
  [*Note [1](#note-1)*:
  This case can result in substitution failure when ranges​::​iter_move(E) appears in the immediate context of a template instantiation[.](#1.3.sentence-2)
 â *end note*]

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L1175)

If ranges​::​iter_move(E) is not equal to *E,
the program is ill-formed, no diagnostic required[.](#2.sentence-1)
