concept range = requires( T& t ) {
ranges::begin(t); // equality-preserving for forward iterators
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.
Given an expression E such that decltype((E)) is T
, T
models range
only if
[
ranges::begin(E),
ranges::end(E))
denotes a range, andforward_iterator
, ranges::begin(E) is equality-preserving (in other words, forward iterators support multi-pass algorithms).A typical range
class only needs to provide two functions:
begin()
whose return type models input_or_output_iterator
.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.
[edit] 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() {}[edit] 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)RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4