GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::ranges::rend(3) C++ Standard Libary std::ranges::rend(3)

std::ranges::rend - std::ranges::rend


Defined in header <ranges>
inline namespace /*unspecified*/ {
(since C++20)
inline constexpr /*unspecified*/ rend = /*unspecified*/; (customization
point object)
}
Call signature
template< class T >


requires /* see below */
constexpr (since C++20)
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> auto


rend( T&& t );


Returns a sentinel indicating the end of a reversed range.


range-rbegin-rend.svg


Let t be an object of type T. If the argument is an lvalue or
ranges::enable_borrowed_range<std::remove_cv_t<T>> is true, then a call to
ranges::rend is expression-equivalent to:


1. t.rend() converted to its decayed type, if that expression with conversion is
valid, and its converted type models
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))>.
2. Otherwise, rend(t) converted to its decayed type, if T is a class or enumeration
type, the aforementioned unqualified call with conversion is valid, and its
converted type models
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))>, where the
overload resolution is performed with the following candidates:


* void rend(auto&) = delete;
* void rend(const auto&) = delete;
* any declarations of rend found by argument-dependent lookup.


3. Otherwise, std::make_reverse_iterator(ranges::begin(t)) if both ranges::begin(t)
and ranges::end(t) are valid expressions, have the same type, and that type
models std::bidirectional_iterator.


In all other cases, a call to ranges::rend is ill-formed, which can result in
substitution failure when ranges::rend(t) appears in the immediate context of a
template instantiation.


Expression-equivalent


Expression e is expression-equivalent to expression f, if


* e and f have the same effects, and
* either both are constant subexpressions or else neither is a constant
subexpression, and
* either both are potentially-throwing or else neither is potentially-throwing
(i.e. noexcept(e) == noexcept(f)).


Customization point objects


The name ranges::rend denotes a customization point object, which is a const
function object of a literal semiregular class type. For exposition purposes, the
cv-unqualified version of its type is denoted as __rend_fn.


All instances of __rend_fn are equal. The effects of invoking different instances of
type __rend_fn on the same arguments are equivalent, regardless of whether the
expression denoting the instance is an lvalue or rvalue, and is const-qualified or
not (however, a volatile-qualified instance is not required to be invocable). Thus,
ranges::rend can be copied freely and its copies can be used interchangeably.


Given a set of types Args..., if std::declval<Args>()... meet the requirements for
arguments to ranges::rend above, __rend_fn models


* std::invocable<__rend_fn, Args...>,
* std::invocable<const __rend_fn, Args...>,
* std::invocable<__rend_fn&, Args...>, and
* std::invocable<const __rend_fn&, Args...>.


Otherwise, no function call operator of __rend_fn participates in overload
resolution.


If the argument is an rvalue (i.e. T is an object type) and
ranges::enable_borrowed_range<std::remove_cv_t<T>> is false, or if it is of an array
type of unknown bound, the call to ranges::rend is ill-formed, which also results in
substitution failure.


If ranges::rend(std::forward<T>(t)) is valid, then
decltype(ranges::rend(std::forward<T>(t))) and
decltype(ranges::begin(std::forward<T>(t))) model std::sentinel_for in all cases,
while T models std::ranges::range.


The C++20 standard requires that if the underlying rend function call returns a
prvalue, the return value is move-constructed from the materialized temporary
object. All implementations directly return the prvalue instead. The requirement is
corrected by the post-C++20 proposal P0849R8 to match the implementations.

// Run this code


#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>


int main()
{
std::vector<int> v = { 3, 1, 4 };
namespace ranges = std::ranges;
if (ranges::find(ranges::rbegin(v), ranges::rend(v), 5) != ranges::rend(v)) {
std::cout << "found a 5 in vector `v`!\n";
}


int a[] = { 5, 10, 15 };
if (ranges::find(ranges::rbegin(a), ranges::rend(a), 5) != ranges::rend(a)) {
std::cout << "found a 5 in array `a`!\n";
}
}


found a 5 in array `a`!


ranges::crend returns a reverse end iterator to a read-only range
(C++20) (customization point object)
ranges::rbegin returns a reverse iterator to a range
(C++20) (customization point object)
rend returns a reverse end iterator for a container or array
crend (function template)
(C++14)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.