The name iter_move denotes a customization point object ([customization.point.object]). The expression ranges::iter_move(E) for some subexpression E is expression-equivalent to the following:
static_cast<decltype(iter_move(E))>(iter_move(E)), if that expression is well-formed when evaluated in a context that does not include ranges::iter_move but does include the lookup set produced by argument-dependent lookup ( ISO/IEC 14882:2014 §[basic.lookup.argdep]).
Otherwise, if the expression *E is well-formed:
if *E is an lvalue, std::move(*E);
otherwise, static_cast<decltype(*E)>(*E).
Otherwise, ranges::iter_move(E) is ill-formed.
If ranges::iter_move(E) does not equal *E, the program is ill-formed with no diagnostic required.