The expression
ranges::begin(E) for some subexpression E is
expression-equivalent to:

- E + 0 if E is an lvalue of array type ([basic.compound]).
- Otherwise, if E is an lvalue, decay-copy(E.begin()) if it is a valid expression and its type I models input_or_output_iterator.
- Otherwise, decay-copy(begin(E)) if it is a
valid expression and its type I models
input_or_output_iterator with overload
resolution performed in a context that includes the declarations:
template<class T> void begin(T&&) = delete; template<class T> void begin(initializer_list<T>&&) = delete;

and does not include a declaration of ranges::begin. - Otherwise, ranges::begin(E) is ill-formed. [ Note: This case can result in substitution failure when ranges::begin(E) appears in the immediate context of a template instantiation. —]
*end note*