Otherwise, if T is an array type ([basic.compound]) and
remove_all_extents_t<T> is an incomplete type,
ranges::begin(E) is ill-formed with no diagnostic required.
Otherwise, if decay-copy(t.begin())
is a valid expression whose type models
input_or_output_iterator,
ranges::begin(E) is expression-equivalent to
decay-copy(t.begin()).
Otherwise, if T is a class or enumeration type and
decay-copy(begin(t))
is a valid expression whose type models
input_or_output_iterator
with overload resolution performed in a context in which
unqualified lookup for begin finds only the declarations
Diagnosable ill-formed cases above
result in substitution failure when ranges::begin(E)
appears in the immediate context of a template instantiation.