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> // Минимальный диапазон struct SimpleRange { int* begin(); int* end(); }; static_assert(std::ranges::range<SimpleRange>); // Не диапазон: нет begin/end struct NotRange { int t {}; }; static_assert(!std::ranges::range<NotRange>); // Не диапазон: begin не возвращает input_or_output_iterator struct NotRange2 { void* begin(); int* end(); }; static_assert(!std::ranges::range<NotRange2>); int main() {}
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 3915 | C++20 |
ranges::
begin
(
t
)
и
ranges::
end
(
t
)
не требовали неявных вариаций выражений |
удалено
избыточное описание |