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

- Otherwise, if E is an lvalue, decay-copy(E.begin()) if it is a valid expression and its type I models Iterator.
- Otherwise, decay-copy(begin(E)) if it is a valid expression and its type I models 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.