24 Ranges library [ranges]

24.3 Range access [range.access]

24.3.5 ranges​::​rbegin [range.access.rbegin]

The name ranges​::​rbegin denotes a customization point object.
The expression ranges​::​​rbegin(E) for some subexpression E is expression-equivalent to:
  • If E is an lvalue, decay-copy(E.rbegin()) if it is a valid expression and its type I models input_­or_­output_­iterator.
  • Otherwise, decay-copy(rbegin(E)) if it is a valid expression and its type I models input_­or_­output_­iterator with overload resolution performed in a context that includes the declaration:
    template<class T> void rbegin(T&&) = delete;
    and does not include a declaration of ranges​::​rbegin.
  • Otherwise, make_­reverse_­iterator(ranges​::​end(E)) if both ranges​::​begin(E) and ranges​::​end(​E) are valid expressions of the same type I which models bidirectional_­iterator ([iterator.concept.bidir]).
  • Otherwise, ranges​::​rbegin(E) is ill-formed.
    : This case can result in substitution failure when ranges​::​rbegin(E) appears in the immediate context of a template instantiation. — end note
Whenever ranges​::​rbegin(E) is a valid expression, its type models input_­or_­output_­iterator.
— end note