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>
	Defined in header <iterator>
	inline namespace /* unspecified */ {
									(since
     C++20)
	    inline  constexpr  /*  unspecified */ end = /* unspecified	   (cus-
     tomization point
	*/;								object)

	}
	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

	If  the  argument is an lvalue or ranges::enable_borrowed_range<std::re-
     move_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_reference_t<T>> is in-
     complete,
		 then the call to ranges::end is ill-formed, no  diagnostic  re-
     quired.
	 2. Otherwise,
	    decay-copy(t.end())
	    (until C++23)
	    auto(t.end())
	    (since C++23), if that expression is valid, and its type models
	    std::sentinel_for<ranges::iterator_t<T>>.
	 3. Otherwise,
	    decay-copy(end(t))
	    (until C++23)
	    auto(end(t))
	    (since  C++23), if T is a class or enumeration type, that expression
     is valid and
	    its converted type models  std::sentinel_for<ranges::iterator_t<T>>,
     where the
	    meaning of end is established as if by performing argument-dependent
     lookup
	    only.

	In  all  other cases, a call to ranges::end is ill-formed, which can re-
     sult in
	substitution failure when the call to ranges::end appears in the immedi-
     ate context
	of a template instantiation.

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 re-
     turns a
	prvalue, the return value is move-constructed from the materialized tem-
     porary
	object. All implementations directly return the prvalue instead. The re-
     quirement is
	corrected  by  the  post-C++20 proposal P0849R8 to match the implementa-
     tions.

Example
     // Run this code

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

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

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

Output:
      found a 5 in array arr!

	Defect reports

	The following behavior-changing defect	reports  were  applied	retroac-
     tively to
	previously published C++ standards.

	  DR	Applied to	     Behavior as published		 Correct
     behavior
	P2602R2  C++20	     there's  machinery to prohibit certain	 removed
     such machinery
			   non-member end found by ADL

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 	   2024.06.10		     std::ranges::end(3)

home | help