Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::ranges::rend(3)	      C++ Standard Libary	  std::ranges::rend(3)

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

Synopsis
	  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	poten-
       tially-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  dif-
       ferent 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	inter-
       changeably.

	  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.

Notes
	  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 implemen-
       tations.

Example
       // 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";
	    }
	}

Output:
	found a	5 in array `a`!

See also
	  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 ar-
       ray
	  crend		 (function template)
	  (C++14)

http://cppreference.com		  2022.07.31		  std::ranges::rend(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::ranges::rend&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help