cpp/ranges/reverse view

@1@ A range adaptor that represents a view of underlying with reversed order. @2@ . The expression is expression-equivalent to one of the following expressions, except that  is evaluated only once:
 * , if the type of is a (possibly cv-qualified) specialization of ;
 * otherwise, if the type of is (possibly cv-qualified)  for some iterator type  and value  of type :
 * , if is ;
 * otherwise ;

In other words, unwraps reversed views if possible.
 * otherwise.

A always models  and, and it models , , or  if the underlying view type  models the corresponding concept.

Data members
Typical implementations of hold only one or two member objects:
 * the underlying view of type (shown here as, the name is exposition only), and
 * a std-like cache object that holds either no value or the end iterator/position of the underlying view, which exists only if the underlying view type does not model.

Member functions
{{member|{{small|std::ranges::reverse_view::}}reverse_view| {{dcl begin}} {{dcl|num=1|since=c++20|1= reverse_view requires std::default_initializable = default; }} {{dcl|num=2|since=c++20| constexpr reverse_view( V r ); }} {{dcl end}}

@1@ Value-initializes {{tti|base_}} via its default member initializer ({{c|1== V}}). @2@ Initializes {{tti|base_}} with {{c|std::move(r)}}.

Parameters
}}

Helper templates
This specialization of makes  satisfy  when the underlying view satisfies it.