Namespaces
Variants

std::ranges::range

От ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
Определён в заголовке <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 только если

Примечания

Типичный класс range требует реализации всего двух функций:

  1. Функция-член begin() , возвращаемый тип которой моделирует input_or_output_iterator .
  2. Функция-член 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 )
не требовали неявных вариаций выражений
удалено
избыточное описание