std::ranges::range
Min standard notice:
Header: <ranges>
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.
# Declarations
template< class T >
concept range = requires( T& t ) {
ranges::begin(t); // equality-preserving for forward iterators
ranges::end (t);
};
(since C++20)
# Notes
A typical range class only needs to provide two functions:
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
| 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 theredundant description |