std::ranges::range
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | ||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|||||||||||||||||
Defined in header <ranges>
|
||
|
template
<
class T >
concept range = requires( T& 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
-
[ranges::begin(E),ranges::end(E))denotes a range - both ranges::begin(E) and ranges::end(E) are amortized constant time and do not alter the value of E in a manner observable to equality-preserving
- if the type of ranges::begin(E) models
forward_iterator, ranges::begin(E) is equality-preserving
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>, whereItis the return type ofbegin()
Alternatively, they can be non-member functions, to be found by argument-dependent lookup.
Example
#include <ranges> // A minimum range struct SimpleRange { int* begin(); int* end(); }; static_assert(std::ranges::range<SimpleRange>); // Not a range: no begin/end struct NotRange { int t {}; }; static_assert(!std::ranges::range<NotRange>); // Not a range: begin does not return an input_or_output_iterator struct NotRange2 { void* begin(); int* end(); }; static_assert(!std::ranges::range<NotRange2>); int main() {}
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)
|
removed the redundant description |