std::ranges::end
Header: <ranges>
Returns a sentinel indicating the end of a range.
# Declarations
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ end = /* unspecified */;
}
(since C++20) (customization point object)
Call signature
template< class T >
requires /* see below */
constexpr std::sentinel_for<ranges::iterator_t<T>> auto end( T&& t );
(since C++20)
# Notes
If the argument is an rvalue (i.e. T is an object type) and ranges::enable_borrowed_range<std::remove_cv_t
If ranges::end(std::forward
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 implementations.
# Example
#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";
}
# Defect reports
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P2602R2 | C++20 | there’s machinery to prohibit certain non-member end found by ADL | removed such machinery |