std::ranges::range
Определён в заголовке <ranges> | ||
|---|---|---|
template< class T >
concept range = requires( T& t ) {
ranges::begin(t); // equality-preserving for forward iterators
ranges::end (t);
};
| (начиная с C++20) |
Концепт range задаёт требования к типу, который позволяет перебирать его элементы, предоставляя итератор и сентинел, обозначающие элементы диапазона.
Семантические требования
Для заданного выражения E, такого что decltype((E)) является T, T удовлетворяет range только если
-
[ranges::begin(E),ranges::end(E))обозначает диапазон, и - обе операции
ranges::begin(E)иranges::end(E)выполняются за амортизированное константное время и не изменяют значениеEспособом, наблюдаемым выражениями, сохраняющими равенство, и - если тип
ranges::begin(E)удовлетворяет концептуforward_iterator,ranges::begin(E)сохраняет равенство (иными словами, итераторы прямого прохода поддерживают алгоритмы с несколькими проходами).
Примечания
Типичному классу range достаточно предоставить две функции:
- Функцию-член
begin(), тип возвращаемого значения которой удовлетворяет концептуinput_or_output_iterator. - Функцию-член
end(), тип возвращаемого значения которой удовлетворяет концептуsentinel_for<It>, гдеIt— это тип возвращаемого значенияbegin().
В качестве альтернативы они могут быть нестатическими функциями-членами; такие функции можно найти с помощью поиска, зависящего от аргументов.
Пример
#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() {}
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 3915 | C++20 |
ranges::begin(t) и ranges::end(t)не требовали неявных вариантов выражений | удалено избыточное описание |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/range