Otherwise, if T is an array type ([basic.compound]) and
remove_all_extents_t<T> is an incomplete type,
ranges::rend(E) is ill-formed with no diagnostic required.
Otherwise, if decay-copy(t.rend())
is a valid expression whose type models
sentinel_for<decltype(ranges::rbegin(E))>
then ranges::rend(E) is expression-equivalent to
decay-copy(t.rend()).
Otherwise, if T is a class or enumeration type and
decay-copy(rend(t))
is a valid expression whose type models
sentinel_for<decltype(ranges::rbegin(E))>
with overload resolution performed in a context in which
unqualified lookup for rend 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]),
then ranges::rend(E) is expression-equivalent to
make_reverse_iterator(ranges::begin(t)).