std::ranges:: range
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | ||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
|
Определено в заголовочном файле
<ranges>
|
||
|
template
<
class
T
>
concept range
=
requires
(
T
&
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
)
не требовали неявных вариаций выражений |
удалено
избыточное описание |