std::ranges::range

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

DRApplied toBehavior as publishedCorrect behavior
LWG 3915C++20ranges::begin(t) and ranges::end(t)did not require implicit expression variationsremoved theredundant description