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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::ranges::end	- std::ranges::end

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

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

	  constexpr std::sentinel_for<ranges::iterator_t<T>> auto end(
	  T&& t	);

	  Returns a sentinel indicating	the end	of a range.

	  range-begin-end.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::end is expression-equivalent to:

	   1. t	+ std::extent_v<T> if t	has an array type of known bound.

			   If	  std::remove_all_extents_t<std::remove_refer-
       ence_t<T>> is
			   incomplete,	then  the  call	to ranges::end is ill-
       formed, no
			   diagnostic required.

	   2. Otherwise, t.end() converted to its decayed type,	 if  that  ex-
       pression	with
	      conversion is valid, and its converted type models
	      std::sentinel_for<ranges::iterator_t<T>>.
	   3.  Otherwise,  end(t)  converted  to  its decayed type, if t has a
       class or	enumeration
	      type, the	aforementioned unqualified  call  with	conversion  is
       valid, and its
	      converted	 type models std::sentinel_for<ranges::iterator_t<T>>,
       where the
	      overload resolution is performed with the	following candidates:

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

	  In all other cases, a	call to	ranges::end is ill-formed,  which  can
       result in
	  substitution failure when the	call to	ranges::end appears in the im-
       mediate 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::end	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 __end_fn.

	  All instances	of __end_fn are	equal. The effects of invoking differ-
       ent instances of
	  type __end_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::end  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::end above, __end_fn models

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

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

	  If ranges::end(std::forward<T>(t)) is	valid, then
	  decltype(ranges::end(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 end 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(v,	5) != ranges::end(v)) {
		std::cout << "found a 5	in vector v!\n";
	    }

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

Output:
	found a	5 in array a!

See also
	  ranges::cend	 returns  a sentinel indicating	the end	of a read-only
       range
	  (C++20)	(customization point object)
	  ranges::begin	returns	an iterator to the beginning of	a range
	  (C++20)	(customization point object)
	  end
	  cend		returns	an iterator to the end of a container or array
	  (C++11)	(function template)
	  (C++14)

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

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

home | help