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