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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::ranges::crbegin - std::ranges::crbegin

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

	  inline   constexpr  /*unspecified*/  crbegin	=		(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 crbegin(
	  T&& t	);

	  Returns an iterator to the first element of the const-qualified  ar-
       gument that is
	  treated as a reversed	sequence.

	  range-rbegin-rend.svg

	  Let CT be

	   1.  const  std::remove_reference_t<T>&  if the argument is a	lvalue
       (i.e. T is an
	      lvalue reference type),
	   2. const T otherwise,

	  a call to ranges::crbegin is expression-equivalent to
	  ranges::rbegin(static_cast<CT&&>(t)).

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

	 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::crbegin 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 __crbegin_fn.

	  All  instances  of  __crbegin_fn  are	equal. The effects of invoking
       different instances
	  of type __crbegin_fn on the same arguments are  equivalent,  regard-
       less 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::crbegin  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::crbegin above, __crbegin_fn models

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

	  Otherwise, no	function call operator of __crbegin_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::crbegin is ill-formed, which also  results  in  substitution
       failure.

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

Example
       // Run this code

	#include <iostream>
	#include <vector>
	#include <iterator>
	#include <span>

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

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

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

	    auto si = std::ranges::crbegin(std::span{a}); // OK:
	    static_assert(std::ranges::enable_borrowed_range<
		std::remove_cv_t<decltype(std::span{a})>>);
	    std::cout << *si <<	'\n';
	}

Output:
	4
	15
	15

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

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

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

home | help