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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::ranges::rbegin - std::ranges::rbegin

Synopsis
	  Defined in header <ranges>
	  inline namespace /*unspecified*/ {

	  inline   constexpr  /*unspecified*/  rbegin  =		(since
       C++20)
	  /*unspecified*/;					   (customiza-
       tion point object)

	  }
	  Call signature
	  template< class T >

	  requires   /*	 see  below  */					(since
       C++20)

	  constexpr std::input_or_output_iterator auto rbegin(
	  T&& t	);

	  Returns an iterator to the last element of the argument.

	  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::rbegin is expression-equivalent to:

	   1.  t.rbegin()  converted  to  its decayed type, if that expression
       with conversion is
	      valid, and its converted type models std::input_or_output_itera-
       tor.
	   2. Otherwise, rbegin(t) converted to	its decayed type, if  T	 is  a
       class or
	      enumeration  type, the aforementioned unqualified	call with con-
       version is valid,
	      its converted type models	 std::input_or_output_iterator,	 where
       the overload
	      resolution is performed with the following candidates:

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

	   3. Otherwise,  std::make_reverse_iterator(ranges::end(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::rbegin	is  ill-formed,	 which
       can result in
	  substitution failure when ranges::rbegin(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::rbegin 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 __rbegin_fn.

	  All instances	of __rbegin_fn are equal. The effects of invoking dif-
       ferent instances
	  of type __rbegin_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::rbegin  can  be copied freely	and its	copies can be used in-
       terchangeably.

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

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

	  Otherwise,  no function call operator	of __rbegin_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,   the
       call to
	  ranges::rbegin  is  ill-formed,  which  also results in substitution
       failure.

	  The return type models std::input_or_output_iterator in all cases.

	  The C++20 standard requires that if the underlying  rbegin  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 <iostream>
	#include <vector>
	#include <ranges>
	#include <span>

	int main()
	{
	    std::vector<int> v = { 3, 1, 4 };
	    auto vi = std::ranges::rbegin(v);
	    std::cout << *vi <<	'\n';
	    *vi	= 42; // OK

	    int	a[] = {	-5, 10,	15 };
	    auto ai = std::ranges::rbegin(a);
	    std::cout << *ai <<	'\n';
	    *ai	= 42; // OK

	    // auto x_x	= std::ranges::rbegin(std::vector{6,6,6});
	    // ill-formed: the argument	is an rvalue (see Notes	)

	    auto si = std::ranges::rbegin(std::span{a}); // OK:
	    static_assert(std::ranges::enable_borrowed_range<
		std::remove_cv_t<decltype(std::span{a})>>);
	    *si	= 42; // OK
	}

Output:
	4
	15

See also
	  ranges::crbegin returns a reverse iterator to	a read-only range
	  (C++20)	  (customization point object)
	  rbegin	   returns  a  reverse	iterator to the	beginning of a
       container or array
	  crbegin	  (function template)
	  (C++14)

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

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

home | help