Namespaces
Variants

std::ranges:: range

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <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 )
не требовали неявных вариаций выражений
удалено
избыточное описание