std::ranges::range
Defined in header <ranges> | ||
---|---|---|
template< class T > concept range = requires( T& t ) { ranges::begin(t); // equality-preserving for forward iterators ranges::end (t); }; | (since C++20) |
The range
concept defines the requirements of a type that allows iteration over its elements by providing an iterator and sentinel that denote the elements of the range.
Semantic requirements
Given an expression E
such that decltype((E)) is T
, T
models range
only if
-
[
ranges::begin(E)
,
ranges::end(E)
)
denotes a range, and - both
ranges::begin(E)
andranges::end(E)
are amortized constant time and do not alter the value ofE
in a manner observable to equality-preserving expressions, and - if the type of
ranges::begin(E)
modelsforward_iterator
,ranges::begin(E)
is equality-preserving (in other words, forward iterators support multi-pass algorithms).
Notes
A typical range
class only needs to provide two functions:
- A member function
begin()
whose return type modelsinput_or_output_iterator
. - A member function
end()
whose return type modelssentinel_for
<It>
, whereIt
is the return type ofbegin()
.
Alternatively, they can be non-member functions, to be found by argument-dependent lookup.
Example
#include <iostream> #include <ranges> #include <vector> template<typename T> struct range_t : private T { using T::begin, T::end; /* ... */ }; static_assert(std::ranges::range<range_t<std::vector<int>>>); template<typename T> struct scalar_t { T t {}; /* no begin/end */ }; static_assert(not std::ranges::range<scalar_t<int>>); int main() { if constexpr (range_t<std::vector<int>> r; std::ranges::range<decltype(r)>) std::cout << "r is a range\n"; if constexpr (scalar_t<int> s; not std::ranges::range<decltype(s)>) std::cout << "s is not a range\n"; }
Output:
r is a range s is not a range
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3915 | C++20 |
ranges::begin(t) and ranges::end(t) did not require implicit expression variations | removed the redundant description |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/range