Scroll to navigation

std::ranges::range(3) C++ Standard Libary std::ranges::range(3)

NAME

std::ranges::range - std::ranges::range

Synopsis


Defined in header <ranges>
template< class T >


concept range = requires( T& t ) {
ranges::begin(t); // equality-preserving for forward iterators (since C++20)
ranges::end (t);


};


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.

Notes


A typical range class only needs to provide two functions:


1. A member function begin() whose return type models input_or_output_iterator.
2. A member function end() whose return type models sentinel_for<It>, where It is
the return type of begin().


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>);


Defect reports


The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.


DR Applied to Behavior as published Correct behavior
ranges::begin(t) and ranges::end(t) removed the
LWG 3915 C++20 did not require implicit expression redundant description
variations

2024.06.10 http://cppreference.com