Пространства имён
Варианты
Действия

Заголовочный файл стандартной библиотеки <ranges> (C++20)

Материал из cppreference.com
< cpp‎ | header
 
 
Заголовочные файлы стандартной библиотеки
Языковая поддержка
Концепты
<concepts>(C++20)
Диагностика
Управление памятью
Метапрограммирование
<ratio>(C++11)
Общие утилиты
<charconv>(C++17)
<format>(C++20)
<bit>(C++20)

Строки
<cuchar>(C++11)

Контейнеры
<flat_set>(C++23)
<span>(C++20)
<mdspan>(C++23)

Итераторы
<iterator>
Диапазоны
<ranges>(C++20)
Алгоритмы
Числа
<numbers>(C++20)

Время
<chrono>(C++11)
Локализация
<codecvt>(C++11/17*)
Ввод/вывод
Регулярные выражения
<regex>(C++11)
Поддержка конкуренции
<stop_token>(C++20)
<thread>(C++11)
<atomic>(C++11)
<barrier>(C++20)
<future>(C++11)

Совместимость с C
<cstdbool>(C++11/17/20*)  
<ccomplex>(C++11/17/20*)
<ctgmath>(C++11/17/20*)

<cstdalign>(C++11/17/20*)

<ciso646>(до C++20)

 

Этот заголовочный файл это часть ranges библиотеки.

Содержание

[править]Псевдонимы пространств имен

namespace std {

    namespace views = ranges::views;

}

Псевдоним пространства имен std::views предоставляется как сокращение для std::ranges::views.

Includes

(C++20)
Поддержка оператора трёхстороннего сравнения[править]
Шаблонный класс std::initializer_list[править]
Диапазонные итераторы[править]

Concepts

Range concepts
Определены в пространстве имён std::ranges
указывает, что тип является диапазоном, то есть предоставляет итератор begin и ограничитель end
(концепт)[править]
указывает, что тип является range, и итераторы, полученные из его выражения, могут быть безопасно возвращены без опасности зависания
(концепт)[править]
указывает, что диапазон узнаёт свой размер за константное время
(концепт)[править]
указывает, что диапазон является представлением, то есть имеет постоянное время копирования/перемещения/присваивания
(концепт)[править]
указывает диапазон, тип итератора которого соответствует input_iterator
(концепт)[править]
указывает диапазон, тип итератора которого соответствует output_iterator
(концепт)[править]
указывает диапазон, тип итератора которого соответствует forward_iterator
(концепт)[править]
указывает диапазон, тип итератора которого соответствует bidirectional_iterator
(концепт)[править]
указывает диапазон, тип итератора которого соответствует random_access_iterator
(концепт)[править]
указывает диапазон, тип итератора которого соответствует contiguous_iterator
(концепт)[править]
указывает, что диапазон имеет идентичные типы итератора и ограничителя
(концепт)[править]
определяет требования к range для безопасного преобразования в view
(концепт)[править]
определяет диапазон доступных только для чтения элементов
(концепт)[править]

Functions

Range conversions
Определены в пространстве имён std::ranges
(C++23)
создаёт непросматриваемый объект из входного диапазона
(шаблон функции)[править]

Classes

Range primitives
Определены в пространстве имён std::ranges
получает ассоциированные типы диапазона
(псевдоним шаблона)[править]
Views
Определены в пространстве имён std::ranges
шаблон вспомогательного класса для определения view, используя любопытно повторяющийся образец шаблон
(шаблон класса)[править]
объединяет пару итератор-ограничитель в view
(шаблон класса)[править]
Dangling iterator handling
Определены в пространстве имён std::ranges
тип заполнителя, указывающий, что итератор или поддиапазон не должны быть возвращены, так как они будут висячими
(класс)[править]
получает тип итератора или тип поддиапазона из borrowed_range
(псевдоним шаблона)[править]
Range adaptor objects utility
Определены в пространстве имён std::ranges
вспомогательный шаблон базового класса для определения объекта замыкания адаптера диапазона
(шаблон класса)[править]
Factories
Определены в пространстве имён std::ranges
пустой view без элементов
(шаблон класса)(шаблонная переменная)[править]
view, который содержит единственный элемент указанного значения
(шаблон класса)(объект точки настройки)[править]
view, состоящий из последовательности, сгенерированной путём многократного увеличения начального значения
(шаблон класса)(объект точки настройки)[править]
view, состоящий из элементов, полученных последовательным применением operator>> к соответствующему входному потоку
(шаблон класса)(объект точки настройки)[править]
view, состоящее из последовательности сгенерированной путём повторного создания одного и того же значения
(шаблон класса)(объект точки настройки)[править]
view, состоящее из кортежей результатов, вычисленных с помощью n-арного декартова произведения адаптированных представлений
(шаблон класса)(объект точки настройки)[править]
Adaptors
Определены в пространстве имён std::ranges
view, который включает все элементы range
(псевдоним шаблона)(объект адаптера диапазона)[править]
view из элементов некоторого другого range
(шаблон класса)[править]
view с уникальным владельцем некоторого range
(шаблон класса)[править]
view, который состоит из элементов range, который соответствует предикату
(шаблон класса)(объект адаптера диапазона)[править]
view последовательности, которая применяет функцию преобразования к каждому элементу
(шаблон класса)(объект адаптера диапазона)[править]
view, состоящий из первых N элементов другого view
(шаблон класса)(объект адаптера диапазона)[править]
view, состоящий из начальных элементов другого view, до первого элемента, для которого предикат не вернёт false
(шаблон класса)(объект адаптера диапазона)[править]
view, состоящий из элементов другого view, пропуская первые N элементов
(шаблон класса)(объект адаптера диапазона)[править]
view, состоящий из элементов другого view, пропуская начальную подпоследовательность элементов до первого элемента, для которого предикат вернёт false
(шаблон класса)(объект адаптера диапазона)[править]
view, состоящий из последовательности, полученной уплотнением view, состоящего из range
(шаблон класса)(объект адаптера диапазона)[править]
view по поддиапазонам, полученным в результате разделения другого view с использованием разделителя
(шаблон класса)(объект адаптера диапазона)[править]
view по поддиапазонам, полученным в результате разделения другого view с использованием разделителя
(шаблон класса)(объект адаптера диапазона)[править]
создаёт поддиапазон из итератора и счётчика
(объект точки настройки)[править]
преобразует view в common_range
(шаблон класса)(объект адаптера диапазона)[править]
view, который перебирает элементы другого двунаправленного представления в обратном порядке
(шаблон класса)(объект адаптера диапазона)[править]
преобразует view в constant_range
(шаблон класса)(объект адаптера диапазона)[править]
view последовательность, которая приводит каждый элемент к rvalue
(шаблон класса)(объект адаптера диапазона)[править]
принимает view, состоящий из tuple-like значений, и числа N, и создаёт view из Nго элемента каждого кортежа
(шаблон класса)(объект адаптера диапазона)[править]
принимает view, состоящий из парных значений, и создаёт view первых элементов каждой пары
(шаблон класса)(объект адаптера диапазона)[править]
принимает view, состоящий из парных значений, и создаёт view из вторых элементов каждой пары
(шаблон класса)(объект адаптера диапазона)[править]
view, который отображает каждый элемент адаптированной последовательности в кортеж как позиции элемента, так и его значения
(шаблон класса)(объект адаптера диапазона)[править]
view, состоящий из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса)(объект точки настройки)[править]
view, состоящий из кортежей результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса)(объект точки настройки)[править]
view, состоящий из кортежей ссылок на соседние элементы адаптированного представления
(шаблон класса)(объект адаптера диапазона)[править]
view, состоящий из кортежей результатов применения функции преобразования к смежным элементам адаптированного представления
(шаблон класса)(объект адаптера диапазона)[править]
view, состоящее из последовательности, полученной путём выравнивания представления диапазонов, с разделителем между элементами
(шаблон класса)(объект адаптера диапазона)[править]
view, состоящее из элементов другого view, перемещаюемся по N элементам за раз
(шаблон класса)(объект адаптера диапазона)[править]
view, элемент Mый которого является view над Mый через (M + N - 1)ый элементы другого view
(шаблон класса)(объект адаптера диапазона)[править]
диапазон нескольких view, которые представляют собой неперекрывающиеся последовательные фрагменты элементов другого view размера N
(шаблон класса)(объект адаптера диапазона)[править]
разбивает view на поддиапазоны между каждой парой смежных элементов, для которых данный предикат возвращает false
(шаблон класса)(объект адаптера диапазона)[править]

Customization point objects

Range access
Определены в пространстве имён std::ranges
возвращает итератор на начало диапазона
(объект точки настройки)[править]
возвращает ограничитель, указывающий на конец диапазона
(объект точки настройки)[править]
возвращает итератор на начало диапазона только для чтения
(объект точки настройки)[править]
возвращает ограничитель, указывающий на конец диапазона, доступного только для чтения
(объект точки настройки)[править]
возвращает обратный итератор на диапазон
(объект точки настройки)[править]
возвращает обратный конечный итератор диапазона
(объект точки настройки)[править]
возвращает обратный итератор на диапазон только для чтения
(объект точки настройки)[править]
возвращает обратный конечный итератор на диапазон только для чтения
(объект точки настройки)[править]
возвращает целое число, равное размеру диапазона
(объект точки настройки)[править]
возвращает целое число со знаком, равное размеру диапазона
(объект точки настройки)[править]
проверяет, пуст ли диапазон
(объект точки настройки)[править]
получает указатель на начало непрерывного диапазона
(объект точки настройки)[править]
получает указатель на начало непрерывного диапазона, доступного только для чтения
(объект точки настройки)[править]

Enumerations

Определены в пространстве имён std::ranges
определяет, моделирует ли std::ranges::subrangestd::ranges::sized_range
(перечисление)[править]

Helpers

получает количество компонентов std::ranges::subrange
(специализация шаблона класса)[править]
получает тип итератора или ограничителя для std::ranges::subrange
(специализация шаблона класса)[править]
получает итератор или ограничитель из std::ranges::subrange
(шаблон функции)[править]
определяет диапазон, итератор которого удовлетворяет forward_iterator
(концепт)[править]

[править]Краткое содержание

#include <compare>#include <initializer_list>#include <iterator>   namespace std::ranges{inlinenamespace/* unspecified */{// range accessinlineconstexpr/* unspecified */ begin =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ end =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ cbegin =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ cend =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ rbegin =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ rend =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ crbegin =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ crend =/* unspecified */;// freestanding   inlineconstexpr/* unspecified */ size =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ ssize =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ empty =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ data =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ cdata =/* unspecified */;// freestanding}   // rangestemplate<class T> concept range =/* see description */;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range =false;// freestanding   template<class T> concept borrowed_range =/* see description */;// freestanding   template<class T>using iterator_t = decltype(ranges::begin(declval<T&>()));// freestandingtemplate<range R>using sentinel_t = decltype(ranges::end(declval<R&>()));// freestandingtemplate<range R>using const_iterator_t = const_iterator<iterator_t<R>>;// freestandingtemplate<range R>using range_difference_t = iter_difference_t<iterator_t<R>>;// freestandingtemplate<sized_range R>using range_size_t = decltype(ranges::size(declval<R&>()));// freestandingtemplate<range R>using range_value_t = iter_value_t<iterator_t<R>>;// freestandingtemplate<range R>using range_reference_t = iter_reference_t<iterator_t<R>>;// freestandingtemplate<range R>using range_const_reference_t = iter_const_reference_t<iterator_t<R>>;// freestandingtemplate<range R>using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>;// freestandingtemplate<range R>using range_common_reference_t = iter_common_reference_t<iterator_t<R>>;// freestanding   // sized rangestemplate<class>inlineconstexprbool disable_sized_range =false;// freestanding   template<class T> concept sized_range =/* see description */;// freestanding   // viewstemplate<class T>inlineconstexprbool enable_view =/* see description */;// freestanding   struct view_base {};// freestanding   template<class T> concept view =/* see description */;// freestanding   // other range refinementstemplate<class R, class T> concept output_range =/* see description */;// freestanding   template<class T> concept input_range =/* see description */;// freestanding   template<class T> concept forward_range =/* see description */;// freestanding   template<class T> concept bidirectional_range =/* see description */;// freestanding   template<class T> concept random_access_range =/* see description */;// freestanding   template<class T> concept contiguous_range =/* see description */;// freestanding   template<class T> concept common_range =/* see description */;// freestanding   template<class T> concept viewable_range =/* see description */;// freestanding   template<class T> concept constant_range =/* see description */;// freestanding   // class template view_interfacetemplate<class D> requires is_class_v<D>&& same_as<D, remove_cv_t<D>>class view_interface;// freestanding   // sub-rangesenumclass subrange_kind :bool{ unsized, sized };// freestanding   template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K =/* see description */> requires (K == subrange_kind::sized||!sized_sentinel_for<S, I>)class subrange;// freestanding   template<class I, class S, subrange_kind K>inlineconstexprbool enable_borrowed_range<subrange<I, S, K>>=true;// freestanding   template<size_t N, class I, class S, subrange_kind K> requires ((N ==0&& copyable<I>)|| N ==1)constexprauto get(const subrange<I, S, K>& r);// freestanding   template<size_t N, class I, class S, subrange_kind K> requires (N <2)constexprauto get(subrange<I, S, K>&& r);// freestanding}   namespace std {usingranges::get;// freestanding}   namespace std::ranges{// dangling iterator handlingstruct dangling;// freestanding   // class template elements_oftemplate<range R, class Allocator = allocator<byte>>struct elements_of;   template<range R>using borrowed_iterator_t =/* see description */;// freestanding   template<range R>using borrowed_subrange_t =/* see description */;// freestanding   // range conversionstemplate<class C, input_range R, class... Args> requires (!view<C>)constexpr C to(R&& r, Args&&... args);// freestandingtemplate<template<class...>class C, input_range R, class... Args>constexprauto to(R&& r, Args&&... args);// freestandingtemplate<class C, class... Args> requires (!view<C>)constexprauto to(Args&&... args);// freestandingtemplate<template<class...>class C, class... Args>constexprauto to(Args&&... args);// freestanding   // empty viewtemplate<class T> requires is_object_v<T>class empty_view;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range<empty_view<T>>=true;// freestanding   namespace views {template<class T>inlineconstexpr empty_view<T> empty{};// freestanding}   // single viewtemplate<move_constructible T> requires is_object_v<T>class single_view;// freestanding   namespace views {inlineconstexpr/* unspecified */ single =/* unspecified */;}// freestanding   template<bool Const, class T>using __maybe_const = conditional_t<Const, const T, T>;// exposition only   // iota viewtemplate<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> requires __weakly_equality_comparable_with<W, Bound>&& copyable<W>class iota_view;// freestanding   template<class W, class Bound>inlineconstexprbool enable_borrowed_range<iota_view<W, Bound>>=true;// freestanding   namespace views {inlineconstexpr/* unspecified */ iota =/* unspecified */;}// freestanding   // repeat viewtemplate<move_constructible W, semiregular Bound = unreachable_sentinel_t> requires (is_object_v<W>&& same_as<W, remove_cv_t<W>>&&(__is_integer_like<Bound>|| same_as<Bound, unreachable_sentinel_t>))class repeat_view;   namespace views {inlineconstexpr/* unspecified */ repeat =/* unspecified */;}   // istream viewtemplate<movable Val, class CharT, class Traits = char_traits<CharT>> requires /* see description */class basic_istream_view;template<class Val>using istream_view = basic_istream_view<Val, char>;template<class Val>using wistream_view = basic_istream_view<Val, wchar_t>;   namespace views {template<class T>inlineconstexpr/* unspecified */ istream =/* unspecified */;}   // range adaptor objectstemplate<class D> requires is_class_v<D>&& same_as<D, remove_cv_t<D>>class range_adaptor_closure {};// freestanding   // all viewnamespace views {inlineconstexpr/* unspecified */ all =/* unspecified */;// freestanding   template<viewable_range R>using all_t = decltype(all(declval<R>()));// freestanding}   // ref viewtemplate<range R> requires is_object_v<R>class ref_view;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range<ref_view<T>>=true;// freestanding   // owning viewtemplate<range R> requires /* see description */class owning_view;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range<owning_view<T>>=// freestanding enable_borrowed_range<T>;   // as rvalue viewtemplate<view V> requires input_range<V>class as_rvalue_view;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range<as_rvalue_view<T>>=// freestanding enable_borrowed_range<T>;   namespace views {inlineconstexpr/* unspecified */ as_rvalue =/* unspecified */;}// freestanding   // filter viewtemplate<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class filter_view;// freestanding   namespace views {inlineconstexpr/* unspecified */ filter =/* unspecified */;}// freestanding   // transform viewtemplate<input_range V, move_constructible F> requires view<V>&& is_object_v<F>&& regular_invocable<F&, range_reference_t<V>>&& __can_reference<invoke_result_t<F&, range_reference_t<V>>>class transform_view;// freestanding   namespace views {inlineconstexpr/* unspecified */ transform =/* unspecified */;}// freestanding   // take viewtemplate<view>class take_view;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range<take_view<T>>=// freestanding enable_borrowed_range<T>;   namespace views {inlineconstexpr/* unspecified */ take =/* unspecified */;}// freestanding   // take while viewtemplate<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>class take_while_view;// freestanding   namespace views {inlineconstexpr/* unspecified */ take_while =/* unspecified */;}// freestanding   // drop viewtemplate<view V>class drop_view;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range<drop_view<T>>=// freestanding enable_borrowed_range<T>;   namespace views {inlineconstexpr/* unspecified */ drop =/* unspecified */;}// freestanding   // drop while viewtemplate<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>class drop_while_view;// freestanding   template<class T, class Pred>inlineconstexprbool enable_borrowed_range<drop_while_view<T, Pred>>=// freestanding enable_borrowed_range<T>;   namespace views {inlineconstexpr/* unspecified */ drop_while =/* unspecified */;}// freestanding   // join viewtemplate<input_range V> requires view<V>&& input_range<range_reference_t<V>>class join_view;// freestanding   namespace views {inlineconstexpr/* unspecified */ join =/* unspecified */;}// freestanding   // join with viewtemplate<class R, class P> concept __compatible_joinable_ranges =/* see description */;// exposition only   template<input_range V, forward_range Pattern> requires view<V>&& input_range<range_reference_t<V>>&& view<Pattern>&& __compatible_joinable_ranges<range_reference_t<V>, Pattern>class join_with_view;// freestanding   namespace views {inlineconstexpr/* unspecified */ join_with =/* unspecified */;}// freestanding   // lazy split viewtemplate<class R> concept __tiny_range =/* see description */;// exposition only   template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>|| __tiny_range<Pattern>)class lazy_split_view;// freestanding   // split viewtemplate<forward_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>class split_view;// freestanding   namespace views {inlineconstexpr/* unspecified */ lazy_split =/* unspecified */;// freestandinginlineconstexpr/* unspecified */ split =/* unspecified */;// freestanding}   // counted viewnamespace views {inlineconstexpr/* unspecified */ counted =/* unspecified */;}// freestanding   // common viewtemplate<view V> requires (!common_range<V>&& copyable<iterator_t<V>>)class common_view;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range<common_view<T>>=// freestanding enable_borrowed_range<T>;   namespace views {inlineconstexpr/* unspecified */ common =/* unspecified */;}// freestanding   // reverse viewtemplate<view V> requires bidirectional_range<V>class reverse_view;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range<reverse_view<T>>=// freestanding enable_borrowed_range<T>;   namespace views {inlineconstexpr/* unspecified */ reverse =/* unspecified */;}// freestanding   // as const viewtemplate<input_range R>constexprauto& __possibly_const_range(R& r){// exposition onlyifconstexpr(constant_range<const R>&&!constant_range<R>){returnconst_cast<const R&>(r);}else{return r;}}   template<view V> requires input_range<V>class as_const_view;// freestanding   template<class T>inlineconstexprbool enable_borrowed_range<as_const_view<T>>=// freestanding enable_borrowed_range<T>;   namespace views {inlineconstexpr/* unspecified */ as_const =/* unspecified */;}// freestanding   // elements viewtemplate<input_range V, size_t N> requires /* see description */class elements_view;// freestanding   template<class T, size_t N>inlineconstexprbool enable_borrowed_range<elements_view<T, N>>=// freestanding enable_borrowed_range<T>;   template<class R>using keys_view = elements_view<R, 0>;// freestandingtemplate<class R>using values_view = elements_view<R, 1>;// freestanding   namespace views {template<size_t N>inlineconstexpr/* unspecified */ elements =/* unspecified */;// freestandinginlineconstexprauto keys = elements<0>;// freestandinginlineconstexprauto values = elements<1>;// freestanding}   template<range V> requires /* see description */class enumerate_view;// freestanding   template<class View>inlineconstexprbool enable_borrowed_range<enumerate_view<View>>=// freestanding enable_borrowed_range<View>;   namespace views {inlineconstexpr/* unspecified */ enumerate =/* unspecified */;// freestanding}   // zip viewtemplate<input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)class zip_view;// freestanding   template<class... Views>inlineconstexprbool enable_borrowed_range<zip_view<Views...>>=// freestanding(enable_borrowed_range<Views>&& ...);   namespace views {inlineconstexpr/* unspecified */ zip =/* unspecified */;}// freestanding   // zip transform viewtemplate<move_constructible F, input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)&& is_object_v<F>&& regular_invocable<F&, range_reference_t<Views>...>&& __can_reference<invoke_result_t<F&, range_reference_t<Views>...>>class zip_transform_view;// freestanding   namespace views {inlineconstexpr/* unspecified */ zip_transform =/* unspecified */;}// freestanding   // adjacent viewtemplate<forward_range V, size_t N> requires view<V>&&(N >0)class adjacent_view;// freestanding   template<class V, size_t N>inlineconstexprbool enable_borrowed_range<adjacent_view<V, N>>=// freestanding enable_borrowed_range<V>;   namespace views {template<size_t N>inlineconstexpr/* unspecified */ adjacent =/* unspecified */;// freestandinginlineconstexprauto pairwise = adjacent<2>;// freestanding}   // adjacent transform viewtemplate<forward_range V, move_constructible F, size_t N> requires /* see description */class adjacent_transform_view;// freestanding   namespace views {template<size_t N>inlineconstexpr/* unspecified */ adjacent_transform =/* unspecified */;// freestandinginlineconstexprauto pairwise_transform = adjacent_transform<2>;// freestanding}   // chunk viewtemplate<view V> requires input_range<V>class chunk_view;// freestanding   template<view V> requires forward_range<V>class chunk_view<V>;// freestanding   template<class V>inlineconstexprbool enable_borrowed_range<chunk_view<V>>=// freestanding forward_range<V>&& enable_borrowed_range<V>;   namespace views {inlineconstexpr/* unspecified */ chunk =/* unspecified */;}// freestanding   // slide viewtemplate<forward_range V> requires view<V>class slide_view;// freestanding   template<class V>inlineconstexprbool enable_borrowed_range<slide_view<V>>= enable_borrowed_range<V>;// freestanding   namespace views {inlineconstexpr/* unspecified */ slide =/* unspecified */;}// freestanding   // chunk by viewtemplate<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class chunk_by_view;// freestanding   namespace views {inlineconstexpr/* unspecified */ chunk_by =/* unspecified */;}// freestanding   // stride viewtemplate<input_range V> requires view<V>class stride_view;   template<class V>inlineconstexprbool enable_borrowed_range<stride_view<V>>= enable_borrowed_range<V>;   namespace views {inlineconstexpr/* unspecified */ stride =/* unspecified */;}   // cartesian product viewtemplate<input_range First, forward_range... Vs> requires (view<First>&& ... && view<Vs>)class cartesian_product_view;   namespace views {inlineconstexpr/* unspecified */ cartesian_product =/* unspecified */;}}   namespace std {namespace views = ranges::views;// freestanding   template<class T>struct tuple_size;// freestandingtemplate<size_t I, class T>struct tuple_element;// freestanding   template<class I, class S, ranges::subrange_kind K>struct tuple_size<ranges::subrange<I, S, K>>// freestanding: integral_constant<size_t, 2>{};template<class I, class S, ranges::subrange_kind K>struct tuple_element<0, ranges::subrange<I, S, K>>{// freestandingusing type = I;// freestanding};template<class I, class S, ranges::subrange_kind K>struct tuple_element<1, ranges::subrange<I, S, K>>{// freestandingusing type = S;// freestanding};template<class I, class S, ranges::subrange_kind K>struct tuple_element<0, constranges::subrange<I, S, K>>{// freestandingusing type = I;// freestanding};template<class I, class S, ranges::subrange_kind K>struct tuple_element<1, constranges::subrange<I, S, K>>{// freestandingusing type = S;// freestanding};   struct from_range_t {explicit from_range_t()=default;};// freestandinginlineconstexpr from_range_t from_range{};// freestanding}

[править]Концепт range

namespace std::ranges{template<class T > concept range = requires(T& t){ranges::begin(t);// equality-preserving for forward iteratorsranges::end(t);};}

[править]Концепт borrowed_range

namespace std::ranges{template<class T> concept borrowed_range = range<T>&&(is_lvalue_reference_v<T>|| enable_borrowed_range<remove_cvref_t<T>>);}

[править]Концепт sized_range

namespace std::ranges{template<class T > concept sized_range = range<T>&& requires(T& t){ranges::size(t);};}

[править]Концепт view

namespace std::ranges{template<class T>inlineconstexprbool enable_view = derived_from<T, view_base>;   template<class T> concept view = range<T>&& movable<T>&& enable_view<T>;}

[править]Концепт output_range

namespace std::ranges{template<class R, class T> concept output_range = range<R>&& output_iterator<iterator_t<R>, T>;}

[править]Концепт input_range

namespace std::ranges{template<class T> concept input_range = range<T>&& input_iterator<iterator_t<T>>;}

[править]Концепт forward_range

namespace std::ranges{template<class T> concept forward_range = input_range<T>&& forward_iterator<iterator_t<T>>;}

[править]Концепт bidirectional_range

namespace std::ranges{template<class T> concept bidirectional_range = forward_range<T>&& bidirectional_iterator<iterator_t<T>>;}

[править]Концепт random_access_range

namespace std::ranges{template<class T> concept random_access_range = bidirectional_range<T>&& random_access_iterator<iterator_t<T>>;}

[править]Концепт contiguous_range

namespace std::ranges{template<class T> concept contiguous_range = random_access_range<T>&& contiguous_iterator<iterator_t<T>>&& requires(T& t){{ranges::data(t)}-> same_as<add_pointer_t<range_reference_t<T>>>;};}

[править]Концепт common_range

namespace std::ranges{template<class T> concept common_range = range<T>&& same_as<iterator_t<T>, sentinel_t<T>>;}

[править]Концепт viewable_range

namespace std::ranges{template<class T> concept viewable_range = range<T>&&(borrowed_range<T>|| view<remove_cvref_t<T>>);}

[править]Вспомогательные концепты

Заметка: Следующие имена предназначены только для пояснения, они не являются частью интерфейса.

namespace std::ranges{// unspecified, for name lookup onlytemplate<class R> concept __simple_view =// exposition only view<R>&& range<const R>&& same_as<iterator_t<R>, iterator_t<const R>>&& same_as<sentinel_t<R>, sentinel_t<const R>>;   template<class I> concept __has_arrow =// exposition only input_iterator<I>&&(is_pointer_v<I>|| requires(I i){ i.operator->();});   template<class T, class U> concept __different_from =// exposition only!same_as<remove_cvref_t<T>, remove_cvref_t<U>>;}

[править]Шаблон класса std::ranges::view_interface

namespace std::ranges{template<class D> requires is_class_v<D>&& same_as<D, remove_cv_t<D>>class view_interface {private:constexpr D& derived()noexcept{// exposition onlyreturnstatic_cast<D&>(*this);}constexprconst D& derived()constnoexcept{// exposition onlyreturnstatic_cast<const D&>(*this);}   public:constexprbool empty() requires sized_range<D>|| forward_range<D>{ifconstexpr(sized_range<D>)returnranges::size(derived())==0;elsereturnranges::begin(derived())==ranges::end(derived());}constexprbool empty()const requires sized_range<const D>|| forward_range<const D>{ifconstexpr(sized_range<const D>)returnranges::size(derived())==0;elsereturnranges::begin(derived())==ranges::end(derived());}   constexprauto cbegin(){returnranges::cbegin(derived());}constexprauto cbegin()const requires range<const D>{returnranges::cbegin(derived());}constexprauto cend(){returnranges::cend(derived());}constexprauto cend()const requires range<const D>{returnranges::cend(derived());}   constexprexplicit operator bool() requires requires {ranges::empty(derived());}{return!ranges::empty(derived());}constexprexplicit operator bool()const requires requires {ranges::empty(derived());}{return!ranges::empty(derived());}   constexprauto data() requires contiguous_iterator<iterator_t<D>>{return to_address(ranges::begin(derived()));}constexprauto data()const requires range<const D>&& contiguous_iterator<iterator_t<const D>>{return to_address(ranges::begin(derived()));}   constexprauto size() requires forward_range<D>&& sized_sentinel_for<sentinel_t<D>, iterator_t<D>>{returnranges::end(derived())-ranges::begin(derived());}constexprauto size()const requires forward_range<const D>&& sized_sentinel_for<sentinel_t<const D>, iterator_t<const D>>{returnranges::end(derived())-ranges::begin(derived());}   constexpr decltype(auto) front() requires forward_range<D>;constexpr decltype(auto) front()const requires forward_range<const D>;   constexpr decltype(auto) back() requires bidirectional_range<D>&& common_range<D>;constexpr decltype(auto) back()const requires bidirectional_range<const D>&& common_range<const D>;   template<random_access_range R = D>constexpr decltype(auto) operator[](range_difference_t<R> n){returnranges::begin(derived())[n];}template<random_access_range R =const D>constexpr decltype(auto) operator[](range_difference_t<R> n)const{returnranges::begin(derived())[n];}};}

[править]Шаблон класса std::ranges::subrange

namespace std::ranges{template<class From, class To> concept __uses_nonqualification_pointer_conversion =// exposition only is_pointer_v<From>&& is_pointer_v<To>&&!convertible_to<remove_pointer_t<From>(*)[], remove_pointer_t<To>(*)[]>;   template<class From, class To> concept __convertible_to_non_slicing =// exposition only convertible_to<From, To>&&!__uses_nonqualification_pointer_conversion<decay_t<From>, decay_t<To>>;   template<class T, class U, class V> concept __pair_like_convertible_from =// exposition only!range<T>&&!is_reference_v<T>&& __pair_like<T>&& constructible_from<T, U, V>&& __convertible_to_non_slicing<U, tuple_element_t<0, T>>&& convertible_to<V, tuple_element_t<1, T>>;   template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = sized_sentinel_for<S, I>? subrange_kind::sized: subrange_kind::unsized> requires (K == subrange_kind::sized||!sized_sentinel_for<S, I>)class subrange :public view_interface<subrange<I, S, K>>{private:staticconstexprbool StoreSize =// exposition only K == subrange_kind::sized&&!sized_sentinel_for<S, I>; I begin_ = I();// exposition only S end_ = S();// exposition only __make_unsigned_like_t<iter_difference_t<I>> size_ =0;// exposition only; present only when StoreSize is truepublic: subrange() requires default_initializable<I>=default;   constexpr subrange(__convertible_to_non_slicing<I>auto i, S s) requires (!StoreSize);   constexpr subrange(__convertible_to_non_slicing<I>auto i, S s, __make_unsigned_like_t<iter_difference_t<I>> n) requires (K == subrange_kind::sized);   template<__different_from<subrange> R> requires borrowed_range<R>&& __convertible_to_non_slicing<iterator_t<R>, I>&& convertible_to<sentinel_t<R>, S>constexpr subrange(R&& r) requires (!StoreSize || sized_range<R>);   template<borrowed_range R> requires __convertible_to_non_slicing<iterator_t<R>, I>&& convertible_to<sentinel_t<R>, S>constexpr subrange(R&& r, __make_unsigned_like_t<iter_difference_t<I>> n) requires (K == subrange_kind::sized): subrange{ranges::begin(r), ranges::end(r), n}{}   template<__different_from<subrange> PairLike> requires __pair_like_convertible_from<PairLike, const I&, const S&>constexpr operator PairLike()const;   constexpr I begin()const requires copyable<I>;[[nodiscard]]constexpr I begin() requires (!copyable<I>);constexpr S end()const;   constexprbool empty()const;constexpr __make_unsigned_like_t<iter_difference_t<I>> size()const requires (K == subrange_kind::sized);   [[nodiscard]]constexpr subrange next(iter_difference_t<I> n =1)const& requires forward_iterator<I>;[[nodiscard]]constexpr subrange next(iter_difference_t<I> n =1)&&;[[nodiscard]]constexpr subrange prev(iter_difference_t<I> n =1)const requires bidirectional_iterator<I>;constexpr subrange& advance(iter_difference_t<I> n);};   template<input_or_output_iterator I, sentinel_for<I> S> subrange(I, S)-> subrange<I, S>;   template<input_or_output_iterator I, sentinel_for<I> S> subrange(I, S, __make_unsigned_like_t<iter_difference_t<I>>)-> subrange<I, S, subrange_kind::sized>;   template<borrowed_range R> subrange(R&&)-> subrange<iterator_t<R>, sentinel_t<R>, (sized_range<R>|| sized_sentinel_for<sentinel_t<R>, iterator_t<R>>)? subrange_kind::sized: subrange_kind::unsized>;   template<borrowed_range R> subrange(R&&, __make_unsigned_like_t<range_difference_t<R>>)-> subrange<iterator_t<R>, sentinel_t<R>, subrange_kind::sized>;}

[править]Класс std::ranges::dangling

namespace std::ranges{struct dangling {constexpr dangling()noexcept=default;constexpr dangling(auto&&...)noexcept{}};}

[править]Класс std::ranges::elements_of

namespace std::ranges{template<range R, class Allocator = allocator<byte>>struct elements_of {[[no_unique_address]] R range;[[no_unique_address]] Allocator allocator = Allocator();};   template<class R, class Allocator = allocator<byte>> elements_of(R&&, Allocator = Allocator())-> elements_of<R&&, Allocator>;}

[править]Шаблон класса std::ranges::empty_view

namespace std::ranges{template<class T> requires is_object_v<T>class empty_view :public view_interface<empty_view<T>>{public:staticconstexpr T* begin()noexcept{return nullptr;}staticconstexpr T* end()noexcept{return nullptr;}staticconstexpr T* data()noexcept{return nullptr;}staticconstexpr size_t size()noexcept{return0;}staticconstexprbool empty()noexcept{returntrue;}};}

[править]Шаблон класса std::ranges::single_view

namespace std::ranges{template<move_constructible T> requires is_object_v<T>class single_view :public view_interface<single_view<T>>{private: __movable_box<T> value_;// exposition only   public: single_view() requires default_initializable<T>=default;constexprexplicit single_view(const T& t) requires copy_constructible<T>;constexprexplicit single_view(T&& t);template<class... Args> requires constructible_from<T, Args...>constexprexplicit single_view(in_place_t, Args&&... args);   constexpr T* begin()noexcept;constexprconst T* begin()constnoexcept;constexpr T* end()noexcept;constexprconst T* end()constnoexcept;staticconstexpr size_t size()noexcept;constexpr T* data()noexcept;constexprconst T* data()constnoexcept;};   template<class T> single_view(T)-> single_view<T>;}

[править]Шаблон класса std::ranges::iota_view

namespace std::ranges{template<class I> concept decrementable =/* see description */;// exposition only   template<class I> concept advanceable =/* see description */;// exposition only   template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> requires __weakly_equality_comparable_with<W, Bound>&& copyable<W>class iota_view :public view_interface<iota_view<W, Bound>>{private:// class iota_view::iteratorstruct iterator;// exposition only   // class iota_view::sentinelstruct sentinel;// exposition only   W value_ = W();// exposition only Bound bound_ = Bound();// exposition only   public: iota_view() requires default_initializable<W>=default;constexprexplicit iota_view(W value);constexprexplicit iota_view(type_identity_t<W> value, type_identity_t<Bound> bound);constexprexplicit iota_view(iterator first, /* see description */ last);   constexpr iterator begin()const;constexprauto end()const;constexpr iterator end()const requires same_as<W, Bound>;   constexprauto size()const requires /* see description */;};   template<class W, class Bound> requires (!__is_integer_like<W>||!__is_integer_like<Bound>||(__is_signed_integer_like<W>== __is_signed_integer_like<Bound>)) iota_view(W, Bound)-> iota_view<W, Bound>;}

[править]Шаблон класса std::ranges::iota_view::iterator

namespace std::ranges{template<weakly_incrementable W, semiregular Bound> requires __weakly_equality_comparable_with<W, Bound>&& copyable<W>struct iota_view<W, Bound>::iterator{private: W value_ = W();// exposition onlypublic:using iterator_concept =/* see description */;using iterator_category = input_iterator_tag;// present only if W models// __incrementable and __IOTA_DIFF_T(W) is an integral type   using value_type = W;using difference_type = __IOTA_DIFF_T(W);   iterator() requires default_initializable<W>=default;constexprexplicit iterator(W value);   constexpr W operator*()constnoexcept(is_nothrow_copy_constructible_v<W>);   constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires incrementable<W>;   constexpr iterator& operator--() requires decrementable<W>;constexpr iterator operator--(int) requires decrementable<W>;   constexpr iterator& operator+=(difference_type n) requires advanceable<W>;constexpr iterator& operator-=(difference_type n) requires advanceable<W>;constexpr W operator[](difference_type n)const requires advanceable<W>;   friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<W>;   friendconstexprbool operator<(const iterator& x, const iterator& y) requires totally_ordered<W>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires totally_ordered<W>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires totally_ordered<W>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires totally_ordered<W>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires totally_ordered<W>&& three_way_comparable<W>;   friendconstexpr iterator operator+(iterator i, difference_type n) requires advanceable<W>;friendconstexpr iterator operator+(difference_type n, iterator i) requires advanceable<W>;   friendconstexpr iterator operator-(iterator i, difference_type n) requires advanceable<W>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires advanceable<W>;};}

[править]Шаблон класса std::ranges::iota_view::sentinel

namespace std::ranges{template<weakly_incrementable W, semiregular Bound> requires __weakly_equality_comparable_with<W, Bound>&& copyable<W>struct iota_view<W, Bound>::sentinel{private: Bound bound_ = Bound();// exposition onlypublic: sentinel()=default;constexprexplicit sentinel(Bound bound);   friendconstexprbool operator==(const iterator& x, const sentinel& y);   friendconstexpr iter_difference_t<W> operator-(const iterator& x, const sentinel& y) requires sized_sentinel_for<Bound, W>;friendconstexpr iter_difference_t<W> operator-(const sentinel& x, const iterator& y) requires sized_sentinel_for<Bound, W>;};}

[править]Шаблон класса std::ranges::repeat_view

namespace std::ranges{template<move_constructible W, semiregular Bound = unreachable_sentinel_t> requires (is_object_v<W>&& same_as<W, remove_cv_t<W>>&&(__is_integer_like<Bound>|| same_as<Bound, unreachable_sentinel_t>))class repeat_view :public view_interface<repeat_view<W, Bound>>{private:// class repeat_view::iteratorstruct iterator;// exposition only   __movable_box<W> value_ = W();// exposition only Bound bound_ = Bound();// exposition only   public: repeat_view() requires default_initializable<W>=default;   constexprexplicit repeat_view(const W& value, Bound bound = Bound()) requires copy_constructible<W>;constexprexplicit repeat_view(W&& value, Bound bound = Bound());template<class... WArgs, class... BoundArgs> requires constructible_from<W, WArgs...>&& constructible_from<Bound, BoundArgs...>constexprexplicit repeat_view(piecewise_construct_t, tuple<WArgs...> value_args, tuple<BoundArgs...> bound_args = tuple<>{});   constexpr iterator begin()const;constexpr iterator end()const requires (!same_as<Bound, unreachable_sentinel_t>);constexpr unreachable_sentinel_t end()constnoexcept;   constexprauto size()const requires (!same_as<Bound, unreachable_sentinel_t>);};   template<class W, class Bound> repeat_view(W, Bound)-> repeat_view<W, Bound>;}

[править]Шаблон класса std::ranges::repeat_view::iterator

namespace std::ranges{template<move_constructible W, semiregular Bound = unreachable_sentinel_t> requires (is_object_v<W>&& same_as<W, remove_cv_t<W>>&&(__is_integer_like<Bound>|| same_as<Bound, unreachable_sentinel_t>))class repeat_view<W, Bound>::iterator{private:using __index_type =// exposition only conditional_t<same_as<Bound, unreachable_sentinel_t>, ptrdiff_t, Bound>;const W* value_ = nullptr;// exposition only __index_type current_ = __index_type();// exposition only   constexprexplicit iterator(const W* value, __index_type b = __index_type());// exposition only   public:using iterator_concept = random_access_iterator_tag;using iterator_category = random_access_iterator_tag;using value_type = W;using difference_type = conditional_t<__is_signed_integer_like<__index_type>, __index_type, __IOTA_DIFF_T(__index_type)>;   iterator()=default;   constexprconst W& operator*()constnoexcept;   constexpr iterator& operator++();constexpr iterator operator++(int);   constexpr iterator& operator--();constexpr iterator operator--(int);   constexpr iterator& operator+=(difference_type n);constexpr iterator& operator-=(difference_type n);constexprconst W& operator[](difference_type n)constnoexcept;   friendconstexprbool operator==(const iterator& x, const iterator& y);friendconstexprauto operator<=>(const iterator& x, const iterator& y);   friendconstexpr iterator operator+(iterator i, difference_type n);friendconstexpr iterator operator+(difference_type n, iterator i);   friendconstexpr iterator operator-(iterator i, difference_type n);friendconstexpr difference_type operator-(const iterator& x, const iterator& y);};}

[править]Шаблон класса std::ranges::basic_istream_view

namespace std::ranges{template<class Val, class CharT, class Traits> concept __stream_extractable =// exposition only requires(basic_istream<CharT, Traits>& is, Val& t){ is >> t;};   template<movable Val, class CharT, class Traits = char_traits<CharT>> requires default_initializable<Val>&& __stream_extractable<Val, CharT, Traits>class basic_istream_view :public view_interface<basic_istream_view<Val, CharT, Traits>>{public:constexprexplicit basic_istream_view(basic_istream<CharT, Traits>& stream);   constexprauto begin(){*stream_ >> value_;return iterator{*this};}   constexpr default_sentinel_t end()constnoexcept;   private:// class basic_istream_view::iteratorstruct iterator;// exposition only basic_istream<CharT, Traits>* stream_;// exposition only Val value_ = Val();// exposition only};}

[править]Шаблон класса std::ranges::basic_istream_view::iterator

namespace std::ranges{template<movable Val, class CharT, class Traits> requires default_initializable<Val>&& __stream_extractable<Val, CharT, Traits>class basic_istream_view<Val, CharT, Traits>::iterator{public:using iterator_concept = input_iterator_tag;using difference_type = ptrdiff_t;using value_type = Val;   constexprexplicit iterator(basic_istream_view& parent)noexcept;   iterator(const iterator&)= delete; iterator(iterator&&)=default;   iterator& operator=(const iterator&)= delete; iterator& operator=(iterator&&)=default;   iterator& operator++();void operator++(int);   Val& operator*()const;   friendbool operator==(const iterator& x, default_sentinel_t);   private: basic_istream_view* parent_;// exposition only};}

[править]Шаблон класса std::ranges::ref_view

namespace std::ranges{template<range R> requires is_object_v<R>class ref_view :public view_interface<ref_view<R>>{private: R* r_;// exposition onlypublic:template<__different_from<ref_view> T> requires /* see description */constexpr ref_view(T&& t);   constexpr R& base()const{return*r_;}   constexpr iterator_t<R> begin()const{returnranges::begin(*r_);}constexpr sentinel_t<R> end()const{returnranges::end(*r_);}   constexprbool empty()const requires requires {ranges::empty(*r_);}{returnranges::empty(*r_);}   constexprauto size()const requires sized_range<R>{returnranges::size(*r_);}   constexprauto data()const requires contiguous_range<R>{returnranges::data(*r_);}};   template<class R> ref_view(R&)-> ref_view<R>;}

[править]Шаблон класса std::ranges::owning_view

namespace std::ranges{template<range R> requires movable<R>&&(!__is_initializer_list<R>)class owning_view :public view_interface<owning_view<R>>{private: R r_ = R();// exposition onlypublic: owning_view() requires default_initializable<R>=default;constexpr owning_view(R&& t);   owning_view(owning_view&&)=default; owning_view& operator=(owning_view&&)=default;   constexpr R& base()&noexcept{return r_;}constexprconst R& base()const&noexcept{return r_;}constexpr R&& base()&&noexcept{return std::move(r_);}constexprconst R&& base()const&&noexcept{return std::move(r_);}   constexpr iterator_t<R> begin(){returnranges::begin(r_);}constexpr sentinel_t<R> end(){returnranges::end(r_);}   constexprauto begin()const requires range<const R>{returnranges::begin(r_);}constexprauto end()const requires range<const R>{returnranges::end(r_);}   constexprbool empty() requires requires {ranges::empty(r_);}{returnranges::empty(r_);}constexprbool empty()const requires requires {ranges::empty(r_);}{returnranges::empty(r_);}   constexprauto size() requires sized_range<R>{returnranges::size(r_);}constexprauto size()const requires sized_range<const R>{returnranges::size(r_);}   constexprauto data() requires contiguous_range<R>{returnranges::data(r_);}constexprauto data()const requires contiguous_range<const R>{returnranges::data(r_);}};}

[править]Шаблон класса std::ranges::as_rvalue_view

namespace std::ranges{template<view V> requires input_range<V>class as_rvalue_view :public view_interface<as_rvalue_view<V>>{ V base_ = V();// exposition only   public: as_rvalue_view() requires default_initializable<V>=default;constexprexplicit as_rvalue_view(V base);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin() requires (!__simple_view<V>){return move_iterator(ranges::begin(base_));}constexprauto begin()const requires range<const V>{return move_iterator(ranges::begin(base_));}   constexprauto end() requires (!__simple_view<V>){ifconstexpr(common_range<V>){return move_iterator(ranges::end(base_));}else{return move_sentinel(ranges::end(base_));}}constexprauto end()const requires range<const V>{ifconstexpr(common_range<const V>){return move_iterator(ranges::end(base_));}else{return move_sentinel(ranges::end(base_));}}   constexprauto size() requires sized_range<V>{returnranges::size(base_);}constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}};   template<class R> as_rvalue_view(R&&)-> as_rvalue_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::filter_view

namespace std::ranges{template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class filter_view :public view_interface<filter_view<V, Pred>>{private: V base_ = V();// exposition only __movable_box<Pred> pred_;// exposition only   // class filter_view::iteratorclass iterator;// exposition only   // class filter_view::sentinelclass sentinel;// exposition only   public: filter_view() requires default_initializable<V>&& default_initializable<Pred>=default;constexprexplicit filter_view(V base, Pred pred);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprconst Pred& pred()const;   constexpr iterator begin();constexprauto end(){ifconstexpr(common_range<V>)return iterator{*this, ranges::end(base_)};elsereturn sentinel{*this};}};   template<class R, class Pred> filter_view(R&&, Pred)-> filter_view<views::all_t<R>, Pred>;}

[править]Шаблон класса std::ranges::filter_view::iterator

namespace std::ranges{template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class filter_view<V, Pred>::iterator{private: iterator_t<V> current_ = iterator_t<V>();// exposition only filter_view* parent_ = nullptr;// exposition only   public:using iterator_concept =/* see description */;using iterator_category =/* see description */;// not always presentusing value_type = range_value_t<V>;using difference_type = range_difference_t<V>;   iterator() requires default_initializable<iterator_t<V>>=default;constexpr iterator(filter_view& parent, iterator_t<V> current);   constexprconst iterator_t<V>& base()const&noexcept;constexpr iterator_t<V> base()&&;constexpr range_reference_t<V> operator*()const;constexpr iterator_t<V> operator->()const requires __has_arrow<iterator_t<V>>&& copyable<iterator_t<V>>;   constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<V>;   constexpr iterator& operator--() requires bidirectional_range<V>;constexpr iterator operator--(int) requires bidirectional_range<V>;   friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<iterator_t<V>>;   friendconstexpr range_rvalue_reference_t<V> iter_move(const iterator& i)noexcept(noexcept(ranges::iter_move(i.current_)));   friendconstexprvoid iter_swap(const iterator& x, const iterator& y)noexcept(noexcept(ranges::iter_swap(x.current_, y.current_))) requires indirectly_swappable<iterator_t<V>>;};}

[править]Шаблон класса std::ranges::filter_view::sentinel

namespace std::ranges{template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class filter_view<V, Pred>::sentinel{private: sentinel_t<V> end_ = sentinel_t<V>();// exposition only   public: sentinel()=default;constexprexplicit sentinel(filter_view& parent);   constexpr sentinel_t<V> base()const;   friendconstexprbool operator==(const iterator& x, const sentinel& y);};}

[править]Шаблон класса std::ranges::transform_view

namespace std::ranges{template<input_range V, move_constructible F> requires view<V>&& is_object_v<F>&& regular_invocable<F&, range_reference_t<V>>&& __can_reference<invoke_result_t<F&, range_reference_t<V>>>class transform_view :public view_interface<transform_view<V, F>>{private:// class template transform_view::iteratortemplate<bool>struct iterator;// exposition only   // class template transform_view::sentineltemplate<bool>struct sentinel;// exposition only   V base_ = V();// exposition only __movable_box<F> fun_;// exposition only   public: transform_view() requires default_initializable<V>&& default_initializable<F>=default;constexprexplicit transform_view(V base, F fun);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexpr iterator<false> begin();constexpr iterator<true> begin()const requires range<const V>&& regular_invocable<const F&, range_reference_t<const V>>;   constexpr sentinel<false> end();constexpr iterator<false> end() requires common_range<V>;constexpr sentinel<true> end()const requires range<const V>&& regular_invocable<const F&, range_reference_t<const V>>;constexpr iterator<true> end()const requires common_range<const V>&& regular_invocable<const F&, range_reference_t<const V>>;   constexprauto size() requires sized_range<V>{returnranges::size(base_);}constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}};   template<class R, class F> transform_view(R&&, F)-> transform_view<views::all_t<R>, F>;}

[править]Шаблон класса std::ranges::transform_view::iterator

namespace std::ranges{template<input_range V, move_constructible F> requires view<V>&& is_object_v<F>&& regular_invocable<F&, range_reference_t<V>>&& __can_reference<invoke_result_t<F&, range_reference_t<V>>>template<bool Const>class transform_view<V, F>::iterator{private:using Parent = __maybe_const<Const, transform_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition only iterator_t<Base> current_ = iterator_t<Base>();// exposition only Parent* parent_ = nullptr;// exposition only   public:using iterator_concept =/* see description */;using iterator_category =/* see description */;// not always presentusing value_type = remove_cvref_t<invoke_result_t<__maybe_const<Const, F>&, range_reference_t<Base>>>;using difference_type = range_difference_t<Base>;   iterator() requires default_initializable<iterator_t<Base>>=default;constexpr iterator(Parent& parent, iterator_t<Base> current);constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>;   constexprconst iterator_t<Base>& base()const&noexcept;constexpr iterator_t<Base> base()&&;   constexpr decltype(auto) operator*()constnoexcept(noexcept(invoke(*parent_->fun_, *current_))){return invoke(*parent_->fun_, *current_);}   constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<Base>;   constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;   constexpr iterator& operator+=(difference_type n) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type n) requires random_access_range<Base>;   constexpr decltype(auto) operator[](difference_type n)const requires random_access_range<Base>{return invoke(*parent_->fun_, current_[n]);}   friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<iterator_t<Base>>;   friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<iterator_t<Base>>;   friendconstexpr iterator operator+(iterator i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, iterator i) requires random_access_range<Base>;   friendconstexpr iterator operator-(iterator i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>;};}

[править]Шаблон класса std::ranges::transform_view::sentinel

namespace std::ranges{template<input_range V, move_constructible F> requires view<V>&& is_object_v<F>&& regular_invocable<F&, range_reference_t<V>>&& __can_reference<invoke_result_t<F&, range_reference_t<V>>>template<bool Const>class transform_view<V, F>::sentinel{private:using Parent = __maybe_const<Const, transform_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition only sentinel_t<Base> end_ = sentinel_t<Base>();// exposition onlypublic: sentinel()=default;constexprexplicit sentinel(sentinel_t<Base> end);constexpr sentinel(sentinel<!Const> i) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;   constexpr sentinel_t<Base> base()const;   template<bool OtherConst> requires sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexpr range_difference_t<__maybe_const<OtherConst, V>> operator-(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexpr range_difference_t<__maybe_const<OtherConst, V>> operator-(const sentinel& y, const iterator<OtherConst>& x);};}

[править]Шаблон класса std::ranges::take_view

namespace std::ranges{template<view V>class take_view :public view_interface<take_view<V>>{private: V base_ = V();// exposition only range_difference_t<V> count_ =0;// exposition only   // class template take_view::sentineltemplate<bool>class sentinel;// exposition only   public: take_view() requires default_initializable<V>=default;constexprexplicit take_view(V base, range_difference_t<V> count);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin() requires (!__simple_view<V>){ifconstexpr(sized_range<V>){ifconstexpr(random_access_range<V>){returnranges::begin(base_);}else{auto sz = range_difference_t<V>(size());return counted_iterator(ranges::begin(base_), sz);}}else{return counted_iterator(ranges::begin(base_), count_);}}   constexprauto begin()const requires range<const V>{ifconstexpr(sized_range<const V>){ifconstexpr(random_access_range<const V>){returnranges::begin(base_);}else{auto sz = range_difference_t<const V>(size());return counted_iterator(ranges::begin(base_), sz);}}else{return counted_iterator(ranges::begin(base_), count_);}}   constexprauto end() requires (!__simple_view<V>){ifconstexpr(sized_range<V>){ifconstexpr(random_access_range<V>)returnranges::begin(base_)+ range_difference_t<V>(size());elsereturn default_sentinel;}else{return sentinel<false>{ranges::end(base_)};}}   constexprauto end()const requires range<const V>{ifconstexpr(sized_range<const V>){ifconstexpr(random_access_range<const V>)returnranges::begin(base_)+ range_difference_t<const V>(size());elsereturn default_sentinel;}else{return sentinel<true>{ranges::end(base_)};}}   constexprauto size() requires sized_range<V>{auto n =ranges::size(base_);returnranges::min(n, static_cast<decltype(n)>(count_));}   constexprauto size()const requires sized_range<const V>{auto n =ranges::size(base_);returnranges::min(n, static_cast<decltype(n)>(count_));}};   template<class R> take_view(R&&, range_difference_t<R>)-> take_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::take_view::sentinel

namespace std::ranges{template<view V>template<bool Const>class take_view<V>::sentinel{private:using Base = __maybe_const<Const, V>;// exposition onlytemplate<bool OtherConst>using CI = counted_iterator< iterator_t<__maybe_const<OtherConst, V>>>;// exposition only sentinel_t<Base> end_ = sentinel_t<Base>();// exposition onlypublic: sentinel()=default;constexprexplicit sentinel(sentinel_t<Base> end);constexpr sentinel(sentinel<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;   constexpr sentinel_t<Base> base()const;   friendconstexprbool operator==(const CI<Const>& y, const sentinel& x);   template<bool OtherConst =!Const> requires sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexprbool operator==(const CI<OtherConst>& y, const sentinel& x);};}

[править]Шаблон класса std::ranges::take_while_view

namespace std::ranges{template<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>class take_while_view :public view_interface<take_while_view<V, Pred>>{// class template take_while_view::sentineltemplate<bool>class sentinel;// exposition only   V base_ = V();// exposition only __movable_box<Pred> pred_;// exposition only   public: take_while_view() requires default_initializable<V>&& default_initializable<Pred>=default;constexprexplicit take_while_view(V base, Pred pred);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprconst Pred& pred()const;   constexprauto begin() requires (!__simple_view<V>){returnranges::begin(base_);}   constexprauto begin()const requires range<const V>&& indirect_unary_predicate<const Pred, iterator_t<const V>>{returnranges::begin(base_);}   constexprauto end() requires (!__simple_view<V>){return sentinel<false>(ranges::end(base_), addressof(*pred_));}   constexprauto end()const requires range<const V>&& indirect_unary_predicate<const Pred, iterator_t<const V>>{return sentinel<true>(ranges::end(base_), addressof(*pred_));}};   template<class R, class Pred> take_while_view(R&&, Pred)-> take_while_view<views::all_t<R>, Pred>;}

[править]Шаблон класса std::ranges::take_while_view::sentinel

namespace std::ranges{template<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>template<bool Const>class take_while_view<V, Pred>::sentinel{using Base = __maybe_const<Const, V>;// exposition only   sentinel_t<Base> end_ = sentinel_t<Base>();// exposition onlyconst Pred* pred_ = nullptr;// exposition only   public: sentinel()=default;constexprexplicit sentinel(sentinel_t<Base> end, const Pred* pred);constexpr sentinel(sentinel<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;   constexpr sentinel_t<Base> base()const{return end_;}   friendconstexprbool operator==(const iterator_t<Base>& x, const sentinel& y);   template<bool OtherConst =!Const> requires sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexprbool operator==(const iterator_t<__maybe_const<OtherConst, V>>& x, const sentinel& y);};}

[править]Шаблон класса std::ranges::drop_view

namespace std::ranges{template<view V>class drop_view :public view_interface<drop_view<V>>{public: drop_view() requires default_initializable<V>=default;constexprexplicit drop_view(V base, range_difference_t<V> count);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin() requires (!(__simple_view<V>&& random_access_range<const V>&& sized_range<const V>));constexprauto begin()const requires random_access_range<const V>&& sized_range<const V>;   constexprauto end() requires (!__simple_view<V>){returnranges::end(base_);}   constexprauto end()const requires range<const V>{returnranges::end(base_);}   constexprauto size() requires sized_range<V>{constauto s =ranges::size(base_);constauto c =static_cast<decltype(s)>(count_);return s < c ?0: s - c;}   constexprauto size()const requires sized_range<const V>{constauto s =ranges::size(base_);constauto c =static_cast<decltype(s)>(count_);return s < c ?0: s - c;}   private: V base_ = V();// exposition only range_difference_t<V> count_ =0;// exposition only};   template<class R> drop_view(R&&, range_difference_t<R>)-> drop_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::drop_while_view

namespace std::ranges{template<view V, class Pred> requires input_range<V>&& is_object_v<Pred>&& indirect_unary_predicate<const Pred, iterator_t<V>>class drop_while_view :public view_interface<drop_while_view<V, Pred>>{public: drop_while_view() requires default_initializable<V>&& default_initializable<Pred>=default;constexprexplicit drop_while_view(V base, Pred pred);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprconst Pred& pred()const;   constexprauto begin();   constexprauto end(){returnranges::end(base_);}   private: V base_ = V();// exposition only __movable_box<Pred> pred_;// exposition only};   template<class R, class Pred> drop_while_view(R&&, Pred)-> drop_while_view<views::all_t<R>, Pred>;}

[править]Шаблон класса std::ranges::join_view

namespace std::ranges{template<input_range V> requires view<V>&& input_range<range_reference_t<V>>class join_view :public view_interface<join_view<V>>{private:using InnerRng = range_reference_t<V>;// exposition only   // class template join_view::iteratortemplate<bool Const>struct iterator;// exposition only   // class template join_view::sentineltemplate<bool Const>struct sentinel;// exposition only   V base_ = V();// exposition only   __non_propagating_cache<remove_cv_t<InnerRng>> inner_;// exposition only, present only// when !is_reference_v<InnerRng>   public: join_view() requires default_initializable<V>=default;constexprexplicit join_view(V base);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin(){constexprbool use_const = __simple_view<V>&& is_reference_v<InnerRng>;return iterator<use_const>{*this, ranges::begin(base_)};}   constexprauto begin()const requires input_range<const V>&& is_reference_v<range_reference_t<const V>>{return iterator<true>{*this, ranges::begin(base_)};}   constexprauto end(){ifconstexpr(forward_range<V>&& is_reference_v<InnerRng>&& forward_range<InnerRng>&& common_range<V>&& common_range<InnerRng>)return iterator<__simple_view<V>>{*this, ranges::end(base_)};elsereturn sentinel<__simple_view<V>>{*this};}   constexprauto end()const requires input_range<const V>&& is_reference_v<range_reference_t<const V>>{ifconstexpr(forward_range<const V>&& forward_range<range_reference_t<const V>>&& common_range<const V>&& common_range<range_reference_t<const V>>)return iterator<true>{*this, ranges::end(base_)};elsereturn sentinel<true>{*this};}};   template<class R>explicit join_view(R&&)-> join_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::join_view::iterator

namespace std::ranges{template<input_range V> requires view<V>&& input_range<range_reference_t<V>>template<bool Const>struct join_view<V>::iterator{private:using Parent = __maybe_const<Const, join_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition onlyusing OuterIter = iterator_t<Base>;// exposition onlyusing InnerIter = iterator_t<range_reference_t<Base>>;// exposition only   staticconstexprbool __ref_is_glvalue =// exposition only is_reference_v<range_reference_t<Base>>;   OuterIter outer_ = OuterIter();// exposition only InnerIter inner_ = InnerIter();// exposition only Parent* parent_ = nullptr;// exposition only   constexprvoid satisfy();// exposition only   public:using iterator_concept =/* see description */;using iterator_category =/* see description */;// not always presentusing value_type = range_value_t<range_reference_t<Base>>;using difference_type =/* see description */;   iterator() requires default_initializable<OuterIter>&& default_initializable<InnerIter>=default;constexpr iterator(Parent& parent, OuterIter outer);constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, OuterIter>&& convertible_to<iterator_t<InnerRng>, InnerIter>;   constexpr decltype(auto) operator*()const{return*inner_;}   constexpr InnerIter operator->()const requires __has_arrow<InnerIter>&& copyable<InnerIter>;   constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires __ref_is_glvalue && forward_range<Base>&& forward_range<range_reference_t<Base>>;   constexpr iterator& operator--() requires __ref_is_glvalue && bidirectional_range<Base>&& bidirectional_range<range_reference_t<Base>>&& common_range<range_reference_t<Base>>;   constexpr iterator operator--(int) requires __ref_is_glvalue && bidirectional_range<Base>&& bidirectional_range<range_reference_t<Base>>&& common_range<range_reference_t<Base>>;   friendconstexprbool operator==(const iterator& x, const iterator& y) requires __ref_is_glvalue && equality_comparable<iterator_t<Base>>&& equality_comparable<iterator_t<range_reference_t<Base>>>;   friendconstexpr decltype(auto) iter_move(const iterator& i)noexcept(noexcept(ranges::iter_move(i.inner_))){returnranges::iter_move(i.inner_);}   friendconstexprvoid iter_swap(const iterator& x, const iterator& y)noexcept(noexcept(ranges::iter_swap(x.inner_, y.inner_))) requires indirectly_swappable<InnerIter>;};}

[править]Шаблон класса std::ranges::join_view::sentinel

namespace std::ranges{template<input_range V> requires view<V>&& input_range<range_reference_t<V>>template<bool Const>struct join_view<V>::sentinel{private:using Parent = __maybe_const<Const, join_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition only sentinel_t<Base> end_ = sentinel_t<Base>();// exposition only   public: sentinel()=default;   constexprexplicit sentinel(Parent& parent);constexpr sentinel(sentinel<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;   template<bool OtherConst> requires sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y);};}

[править]Шаблон класса std::ranges::join_with_view

namespace std::ranges{template<class R, class P> concept __compatible_joinable_ranges =// exposition only common_with<range_value_t<R>, range_value_t<P>>&& common_reference_with<range_reference_t<R>, range_reference_t<P>>&& common_reference_with<range_rvalue_reference_t<R>, range_rvalue_reference_t<P>>;   template<class R> concept __bidirectional_common = bidirectional_range<R>&& common_range<R>;// exposition only   template<input_range V, forward_range Pattern> requires view<V>&& input_range<range_reference_t<V>>&& view<Pattern>&& __compatible_joinable_ranges<range_reference_t<V>, Pattern>class join_with_view :public view_interface<join_with_view<V, Pattern>>{using InnerRng = range_reference_t<V>;// exposition only   V base_ = V();// exposition only __non_propagating_cache<remove_cv_t<InnerRng>> inner_;// exposition only, present only// when !is_reference_v<InnerRng>   Pattern pattern_ = Pattern();// exposition only   // class template join_with_view::iteratortemplate<bool Const>struct iterator;// exposition only   // class template join_with_view::sentineltemplate<bool Const>struct sentinel;// exposition only   public: join_with_view() requires default_initializable<V>&& default_initializable<Pattern>=default;   constexprexplicit join_with_view(V base, Pattern pattern);   template<input_range R> requires constructible_from<V, views::all_t<R>>&& constructible_from<Pattern, single_view<range_value_t<InnerRng>>>constexprexplicit join_with_view(R&& r, range_value_t<InnerRng> e);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin(){constexprbool use_const = __simple_view<V>&& is_reference_v<InnerRng>&& __simple_view<Pattern>;return iterator<use_const>{*this, ranges::begin(base_)};}constexprauto begin()const requires input_range<const V>&& forward_range<const Pattern>&& is_reference_v<range_reference_t<const V>>{return iterator<true>{*this, ranges::begin(base_)};}   constexprauto end(){ifconstexpr(forward_range<V>&& is_reference_v<InnerRng>&& forward_range<InnerRng>&& common_range<V>&& common_range<InnerRng>)return iterator<__simple_view<V>&& __simple_view<Pattern>>{*this, ranges::end(base_)};elsereturn sentinel<__simple_view<V>&& __simple_view<Pattern>>{*this};}constexprauto end()const requires input_range<const V>&& forward_range<const Pattern>&& is_reference_v<range_reference_t<const V>>{using InnerConstRng = range_reference_t<const V>;ifconstexpr(forward_range<const V>&& forward_range<InnerConstRng>&& common_range<const V>&& common_range<InnerConstRng>)return iterator<true>{*this, ranges::end(base_)};elsereturn sentinel<true>{*this};}};   template<class R, class P> join_with_view(R&&, P&&)-> join_with_view<views::all_t<R>, views::all_t<P>>;   template<input_range R> join_with_view(R&&, range_value_t<range_reference_t<R>>)-> join_with_view<views::all_t<R>, single_view<range_value_t<range_reference_t<R>>>>;}

[править]Шаблон класса std::ranges::join_with_view::iterator

namespace std::ranges{template<input_range V, forward_range Pattern> requires view<V>&& input_range<range_reference_t<V>>&& view<Pattern>&& __compatible_joinable_ranges<range_reference_t<V>, Pattern>template<bool Const>class join_with_view<V, Pattern>::iterator{using Parent = __maybe_const<Const, join_with_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition onlyusing InnerBase = range_reference_t<Base>;// exposition onlyusing PatternBase = __maybe_const<Const, Pattern>;// exposition only   using OuterIter = iterator_t<Base>;// exposition onlyusing InnerIter = iterator_t<InnerBase>;// exposition onlyusing PatternIter = iterator_t<PatternBase>;// exposition only   staticconstexprbool __ref_is_glvalue = is_reference_v<InnerBase>;// exposition only   Parent* parent_ = nullptr;// exposition only OuterIter outer_it_ = OuterIter();// exposition only variant<PatternIter, InnerIter> inner_it_;// exposition only   constexpr iterator(Parent& parent, iterator_t<Base> outer);// exposition onlyconstexprauto&& __update_inner(const OuterIter&);// exposition onlyconstexprauto&& __get_inner(const OuterIter&);// exposition onlyconstexprvoid satisfy();// exposition only   public:using iterator_concept =/* see description */;using iterator_category =/* see description */;// not always presentusing value_type =/* see description */;using difference_type =/* see description */;   iterator() requires default_initializable<OuterIter>=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, OuterIter>&& convertible_to<iterator_t<InnerRng>, InnerIter>&& convertible_to<iterator_t<Pattern>, PatternIter>;   constexpr decltype(auto) operator*()const;   constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires __ref_is_glvalue && forward_iterator<OuterIter>&& forward_iterator<InnerIter>;   constexpr iterator& operator--() requires __ref_is_glvalue && bidirectional_range<Base>&& __bidirectional_common<InnerBase>&& __bidirectional_common<PatternBase>;constexpr iterator operator--(int) requires __ref_is_glvalue && bidirectional_range<Base>&& __bidirectional_common<InnerBase>&& __bidirectional_common<PatternBase>;   friendconstexprbool operator==(const iterator& x, const iterator& y) requires __ref_is_glvalue && equality_comparable<OuterIter>&& equality_comparable<InnerIter>;   friendconstexpr decltype(auto) iter_move(const iterator& x){using rvalue_reference = common_reference_t< iter_rvalue_reference_t<InnerIter>, iter_rvalue_reference_t<PatternIter>>;return visit<rvalue_reference>(ranges::iter_move, x.inner_it_);}   friendconstexprvoid iter_swap(const iterator& x, const iterator& y) requires indirectly_swappable<InnerIter, PatternIter>{ visit(ranges::iter_swap, x.inner_it_, y.inner_it_);}};}

[править]Шаблон класса std::ranges::join_with_view::sentinel

namespace std::ranges{template<input_range V, forward_range Pattern> requires view<V>&& input_range<range_reference_t<V>>&& view<Pattern>&& __compatible_joinable_ranges<range_reference_t<V>, Pattern>template<bool Const>class join_with_view<V, Pattern>::sentinel{using Parent = __maybe_const<Const, join_with_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition only sentinel_t<Base> end_ = sentinel_t<Base>();// exposition only   constexprexplicit sentinel(Parent& parent);// exposition only   public: sentinel()=default;constexpr sentinel(sentinel<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;   template<bool OtherConst> requires sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y);};}

[править]Шаблон класса std::ranges::lazy_split_view

namespace std::ranges{template<auto>struct __require_constant;// exposition only   template<class R> concept __tiny_range =// exposition only sized_range<R>&& requires {typename __require_constant<remove_reference_t<R>::size()>;}&&(remove_reference_t<R>::size()<=1);   template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>|| __tiny_range<Pattern>)class lazy_split_view :public view_interface<lazy_split_view<V, Pattern>>{private: V base_ = V();// exposition only Pattern pattern_ = Pattern();// exposition only   __non_propagating_cache<iterator_t<V>> current_;// exposition only, present only// if !forward_range<V>   // class template lazy_split_view::outer-iteratortemplate<bool>struct __outer_iterator;// exposition only   // class template lazy_split_view::inner-iteratortemplate<bool>struct __inner_iterator;// exposition only   public: lazy_split_view() requires default_initializable<V>&& default_initializable<Pattern>=default;constexprexplicit lazy_split_view(V base, Pattern pattern);   template<input_range R> requires constructible_from<V, views::all_t<R>>&& constructible_from<Pattern, single_view<range_value_t<R>>>constexprexplicit lazy_split_view(R&& r, range_value_t<R> e);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin(){ifconstexpr(forward_range<V>){return __outer_iterator<__simple_view<V>&& __simple_view<Pattern>>{*this, ranges::begin(base_)};}else{ current_ =ranges::begin(base_);return __outer_iterator<false>{*this};}}   constexprauto begin()const requires forward_range<V>&& forward_range<const V>{return __outer_iterator<true>{*this, ranges::begin(base_)};}   constexprauto end() requires forward_range<V>&& common_range<V>{return __outer_iterator<__simple_view<V>&& __simple_view<Pattern>>{*this, ranges::end(base_)};}   constexprauto end()const{ifconstexpr(forward_range<V>&& forward_range<const V>&& common_range<const V>)return __outer_iterator<true>{*this, ranges::end(base_)};elsereturn default_sentinel;}};   template<class R, class P> lazy_split_view(R&&, P&&)-> lazy_split_view<views::all_t<R>, views::all_t<P>>;   template<input_range R> lazy_split_view(R&&, range_value_t<R>)-> lazy_split_view<views::all_t<R>, single_view<range_value_t<R>>>;}

[править]Шаблон класса std::ranges::lazy_split_view::outer_iterator

namespace std::ranges{template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>|| __tiny_range<Pattern>)template<bool Const>struct lazy_split_view<V, Pattern>::__outer_iterator {private:using Parent = __maybe_const<Const, lazy_split_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition only Parent* parent_ = nullptr;// exposition only   iterator_t<Base> current_ = iterator_t<Base>();// exposition only, present only// if V models forward_range   bool trailing_empty_ =false;// exposition only   public:using iterator_concept = conditional_t<forward_range<Base>, forward_iterator_tag, input_iterator_tag>;   using iterator_category = input_iterator_tag;// present only if Base// models forward_range   // class lazy_split_view::outer-iterator::value_typestruct value_type;using difference_type = range_difference_t<Base>;   __outer_iterator()=default;constexprexplicit __outer_iterator(Parent& parent) requires (!forward_range<Base>);constexpr __outer_iterator(Parent& parent, iterator_t<Base> current) requires forward_range<Base>;constexpr __outer_iterator(__outer_iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>;   constexpr value_type operator*()const;   constexpr __outer_iterator& operator++();constexpr decltype(auto) operator++(int){ifconstexpr(forward_range<Base>){auto tmp =*this;++*this;return tmp;}else++*this;}   friendconstexprbool operator==(const __outer_iterator& x, const __outer_iterator& y) requires forward_range<Base>;   friendconstexprbool operator==(const __outer_iterator& x, default_sentinel_t);};}

[править]Шаблон класса std::ranges::lazy_split_view::outer_iterator::value_type

namespace std::ranges{template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>|| __tiny_range<Pattern>)template<bool Const>struct lazy_split_view<V, Pattern>::__outer_iterator<Const>::value_type: view_interface<value_type>{private: __outer_iterator i_ = __outer_iterator();// exposition onlypublic: value_type()=default;constexprexplicit value_type(__outer_iterator i);   constexpr __inner_iterator<Const> begin()const;constexpr default_sentinel_t end()constnoexcept;};}

[править]Шаблон класса std::ranges::lazy_split_view::inner_iterator

namespace std::ranges{template<input_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>&&(forward_range<V>|| __tiny_range<Pattern>)template<bool Const>struct lazy_split_view<V, Pattern>::__inner_iterator {private:using Base = __maybe_const<Const, V>;// exposition only __outer_iterator<Const> i_ = __outer_iterator<Const>();// exposition onlybool incremented_ =false;// exposition only   public:using iterator_concept =typename __outer_iterator<Const>::iterator_concept;   using iterator_category =/* see description */;// present only if Base// models forward_rangeusing value_type = range_value_t<Base>;using difference_type = range_difference_t<Base>;   __inner_iterator()=default;constexprexplicit __inner_iterator(__outer_iterator<Const> i);   constexprconst iterator_t<Base>& base()const&noexcept;constexpr iterator_t<Base> base()&& requires forward_range<V>;   constexpr decltype(auto) operator*()const{return*i_.current;}   constexpr __inner_iterator& operator++();constexpr decltype(auto) operator++(int){ifconstexpr(forward_range<Base>){auto tmp =*this;++*this;return tmp;}else++*this;}   friendconstexprbool operator==(const __inner_iterator& x, const __inner_iterator& y) requires forward_range<Base>;   friendconstexprbool operator==(const __inner_iterator& x, default_sentinel_t);   friendconstexpr decltype(auto) iter_move(const __inner_iterator& i)noexcept(noexcept(ranges::iter_move(i.i_.current))){returnranges::iter_move(i.i_.current);}   friendconstexprvoid iter_swap(const __inner_iterator& x, const __inner_iterator& y)noexcept(noexcept(ranges::iter_swap(x.i_.current, y.i_.current))) requires indirectly_swappable<iterator_t<Base>>;};}

[править]Шаблон класса std::ranges::split_view

namespace std::ranges{template<forward_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>class split_view :public view_interface<split_view<V, Pattern>>{private: V base_ = V();// exposition only Pattern pattern_ = Pattern();// exposition only   // class split_view::iteratorstruct iterator;// exposition only   // class split_view::sentinelstruct sentinel;// exposition only   public: split_view() requires default_initializable<V>&& default_initializable<Pattern>=default;constexprexplicit split_view(V base, Pattern pattern);   template<forward_range R> requires constructible_from<V, views::all_t<R>>&& constructible_from<Pattern, single_view<range_value_t<R>>>constexprexplicit split_view(R&& r, range_value_t<R> e);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexpr iterator begin();   constexprauto end(){ifconstexpr(common_range<V>){return iterator{*this, ranges::end(base_), {}};}else{return sentinel{*this};}}   constexpr subrange<iterator_t<V>> __find_next(iterator_t<V>);// exposition only};   template<class R, class P> split_view(R&&, P&&)-> split_view<views::all_t<R>, views::all_t<P>>;   template<forward_range R> split_view(R&&, range_value_t<R>)-> split_view<views::all_t<R>, single_view<range_value_t<R>>>;}

[править]Шаблон класса std::ranges::split_view::iterator

namespace std::ranges{template<forward_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>class split_view<V, Pattern>::iterator{private: split_view* parent_ = nullptr;// exposition only iterator_t<V> cur_ = iterator_t<V>();// exposition only subrange<iterator_t<V>> next_ = subrange<iterator_t<V>>();// exposition onlybool trailing_empty_ =false;// exposition only   public:using iterator_concept = forward_iterator_tag;using iterator_category = input_iterator_tag;using value_type = subrange<iterator_t<V>>;using difference_type = range_difference_t<V>;   iterator()=default;constexpr iterator(split_view& parent, iterator_t<V> current, subrange<iterator_t<V>> next);   constexpr iterator_t<V> base()const;constexpr value_type operator*()const;   constexpr iterator& operator++();constexpr iterator operator++(int);   friendconstexprbool operator==(const iterator& x, const iterator& y);};}

[править]Шаблон класса std::ranges::split_view::sentinel

namespace std::ranges{template<forward_range V, forward_range Pattern> requires view<V>&& view<Pattern>&& indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>struct split_view<V, Pattern>::sentinel{private: sentinel_t<V> end_ = sentinel_t<V>();// exposition only   public: sentinel()=default;constexprexplicit sentinel(split_view& parent);   friendconstexprbool operator==(const iterator& x, const sentinel& y);};}

[править]Шаблон класса std::ranges::common_view

namespace std::ranges{template<view V> requires (!common_range<V>&& copyable<iterator_t<V>>)class common_view :public view_interface<common_view<V>>{private: V base_ = V();// exposition onlypublic: common_view() requires default_initializable<V>=default;   constexprexplicit common_view(V r);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin(){ifconstexpr(random_access_range<V>&& sized_range<V>)returnranges::begin(base_);elsereturn common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::begin(base_));}   constexprauto begin()const requires range<const V>{ifconstexpr(random_access_range<const V>&& sized_range<const V>)returnranges::begin(base_);elsereturn common_iterator<iterator_t<const V>, sentinel_t<const V>>(ranges::begin(base_));}   constexprauto end(){ifconstexpr(random_access_range<V>&& sized_range<V>)returnranges::begin(base_)+ranges::size(base_);elsereturn common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::end(base_));}   constexprauto end()const requires range<const V>{ifconstexpr(random_access_range<const V>&& sized_range<const V>)returnranges::begin(base_)+ranges::size(base_);elsereturn common_iterator<iterator_t<const V>, sentinel_t<const V>>(ranges::end(base_));}   constexprauto size() requires sized_range<V>{returnranges::size(base_);}constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}};   template<class R> common_view(R&&)-> common_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::reverse_view

namespace std::ranges{template<view V> requires bidirectional_range<V>class reverse_view :public view_interface<reverse_view<V>>{private: V base_ = V();// exposition onlypublic: reverse_view() requires default_initializable<V>=default;   constexprexplicit reverse_view(V r);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexpr reverse_iterator<iterator_t<V>> begin();constexpr reverse_iterator<iterator_t<V>> begin() requires common_range<V>;constexprauto begin()const requires common_range<const V>;   constexpr reverse_iterator<iterator_t<V>> end();constexprauto end()const requires common_range<const V>;   constexprauto size() requires sized_range<V>{returnranges::size(base_);}   constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}};   template<class R> reverse_view(R&&)-> reverse_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::as_const_view

namespace std::ranges{template<view V> requires input_range<V>class as_const_view :public view_interface<as_const_view<V>>{ V base_ = V();// exposition only   public: as_const_view() requires default_initializable<V>=default;constexprexplicit as_const_view(V base);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin() requires (!__simple_view<V>){returnranges::cbegin(base_);}constexprauto begin()const requires range<const V>{returnranges::cbegin(base_);}   constexprauto end() requires (!__simple_view<V>){returnranges::cend(base_);}constexprauto end()const requires range<const V>{returnranges::cend(base_);}   constexprauto size() requires sized_range<V>{returnranges::size(base_);}constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}};   template<class R> as_const_view(R&&)-> as_const_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::elements_view

namespace std::ranges{template<class T, size_t N> concept __has_tuple_element =// exposition only __tuple_like<T>&& N < tuple_size_v<T>;   template<class T, size_t N> concept __returnable_element =// exposition only is_reference_v<T>|| move_constructible<tuple_element_t<N, T>>;   template<input_range V, size_t N> requires view<V>&& __has_tuple_element<range_value_t<V>, N>&& __has_tuple_element<remove_reference_t<range_reference_t<V>>, N>&& __returnable_element<range_reference_t<V>, N>class elements_view :public view_interface<elements_view<V, N>>{public: elements_view() requires default_initializable<V>=default;constexprexplicit elements_view(V base);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin() requires (!__simple_view<V>){return iterator<false>(ranges::begin(base_));}   constexprauto begin()const requires range<const V>{return iterator<true>(ranges::begin(base_));}   constexprauto end() requires (!__simple_view<V>&&!common_range<V>){return sentinel<false>{ranges::end(base_)};}   constexprauto end() requires (!__simple_view<V>&& common_range<V>){return iterator<false>{ranges::end(base_)};}   constexprauto end()const requires range<const V>{return sentinel<true>{ranges::end(base_)};}   constexprauto end()const requires common_range<const V>{return iterator<true>{ranges::end(base_)};}   constexprauto size() requires sized_range<V>{returnranges::size(base_);}   constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}   private:// class template elements_view::iteratortemplate<bool>class iterator;// exposition only   // class template elements_view::sentineltemplate<bool>class sentinel;// exposition only   V base_ = V();// exposition only};}

[править]Шаблон класса std::ranges::elements_view::iterator

namespace std::ranges{template<input_range V, size_t N> requires view<V>&& __has_tuple_element<range_value_t<V>, N>&& __has_tuple_element<remove_reference_t<range_reference_t<V>>, N>&& __returnable_element<range_reference_t<V>, N>template<bool Const>class elements_view<V, N>::iterator{using Base = __maybe_const<Const, V>;// exposition only   iterator_t<Base> current_ = iterator_t<Base>();// exposition only   staticconstexpr decltype(auto) __get_element(const iterator_t<Base>& i);// exposition only   public:using iterator_concept =/* see description */;using iterator_category =/* see description */;// not always presentusing value_type = remove_cvref_t<tuple_element_t<N, range_value_t<Base>>>;using difference_type = range_difference_t<Base>;   iterator() requires default_initializable<iterator_t<Base>>=default;constexprexplicit iterator(iterator_t<Base> current);constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>;   constexprconst iterator_t<Base>& base()const&noexcept;constexpr iterator_t<Base> base()&&;   constexpr decltype(auto) operator*()const{return __get_element(current_);}   constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<Base>;   constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;   constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>;   constexpr decltype(auto) operator[](difference_type n)const requires random_access_range<Base>{return __get_element(current_ + n);}   friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<iterator_t<Base>>;   friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<iterator_t<Base>>;   friendconstexpr iterator operator+(const iterator& x, difference_type y) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type x, const iterator& y) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& x, difference_type y) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>;};}

[править]Шаблон класса std::ranges::elements_view::sentinel

namespace std::ranges{template<input_range V, size_t N> requires view<V>&& __has_tuple_element<range_value_t<V>, N>&& __has_tuple_element<remove_reference_t<range_reference_t<V>>, N>&& __returnable_element<range_reference_t<V>, N>template<bool Const>class elements_view<V, N>::sentinel{private:using Base = __maybe_const<Const, V>;// exposition only sentinel_t<Base> end_ = sentinel_t<Base>();// exposition onlypublic: sentinel()=default;constexprexplicit sentinel(sentinel_t<Base> end);constexpr sentinel(sentinel<!Const> other) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;   constexpr sentinel_t<Base> base()const;   template<bool OtherConst> requires sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexpr range_difference_t<__maybe_const<OtherConst, V>> operator-(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexpr range_difference_t<__maybe_const<OtherConst, V>> operator-(const sentinel& x, const iterator<OtherConst>& y);};}

[править]Шаблон класса std::ranges::enumerate_view

template<view V> requires __range_with_movable_references<V>class enumerate_view :public view_interface<enumerate_view<V>>{ V base_ = V();// exposition onlytemplate<bool Const>class iterator;// exposition onlytemplate<bool Const>class sentinel;// exposition onlypublic:constexpr enumerate_view() requires default_initializable<V>=default;constexprexplicit enumerate_view(V base);constexprauto begin() requires(!__simple_view<V>){return iterator<false>(ranges::begin(base_), 0);}constexprauto begin()const requires __range_with_movable_references<const V>{return iterator<true>(ranges::begin(base_), 0);}constexprauto end() requires(!__simple_view<V>){ifconstexpr(common_range<V>&& sized_range<V>)return iterator<false>(ranges::end(base_), ranges::distance(base_));elsereturn sentinel<false>(ranges::end(base_));}constexprauto end()const requires __range_with_movable_references<const V>{ifconstexpr(common_range<const V>&& sized_range<const V>)return iterator<true>(ranges::end(base_), ranges::distance(base_));elsereturn sentinel<true>(ranges::end(base_));}constexprauto size() requires sized_range<V>{returnranges::size(base_);}constexprauto size()const requires sized_range<const V>{returnranges::size(base_);}constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}};template<class R> enumerate_view(R&&)-> enumerate_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::enumerate_view::iterator

namespace std::ranges{template<view V> requires __range_with_movable_references<V>template<bool Const>class enumerate_view<V>::iterator{using Base = __maybe_const<Const, V>;// exposition onlypublic:using iterator_category = input_iterator_tag;using iterator_concept =/* see description */;using difference_type = range_difference_t<Base>;using value_type = tuple<difference_type, range_value_t<Base>>;   private:using __reference_type =// exposition only tuple<difference_type, range_reference_t<Base>>; iterator_t<Base> current_ = iterator_t<Base>();// exposition only difference_type pos_ =0;// exposition onlyconstexprexplicit iterator(iterator_t<Base> current, difference_type pos);// exposition onlypublic: iterator() requires default_initializable<iterator_t<Base>>=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>;constexprconst iterator_t<Base>& base()const&noexcept;constexpr iterator_t<Base> base()&&;constexpr difference_type index()constnoexcept;constexprauto operator*()const{return __reference_type(pos_, *current_);}constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<Base>;constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>;constexprauto operator[](difference_type n)const requires random_access_range<Base>{return __reference_type(pos_ + n, current_[n]);}friendconstexprbool operator==(const iterator& x, const iterator& y)noexcept;friendconstexpr strong_ordering operator<=>(const iterator& x, const iterator& y)noexcept;friendconstexpr iterator operator+(const iterator& x, difference_type y) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type x, const iterator& y) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& x, difference_type y) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y)noexcept;friendconstexprauto iter_move(const iterator& i)noexcept(noexcept(ranges::iter_move(i.current_))&& is_nothrow_move_constructible_v<range_rvalue_reference_t<Base>>){return tuple<difference_type, range_rvalue_reference_t<Base>>( pos_, ranges::iter_move(i.current_));}};}

[править]Шаблон класса std::ranges::enumerate_view::sentinel

namespace std::ranges{template<view V> requires __range_with_movable_references<V>template<bool Const>class enumerate_view<V>::sentinel{// exposition onlyusing Base = __maybe_const<Const, V>;// exposition only sentinel_t<Base> end_ = sentinel_t<Base>();// exposition onlyconstexprexplicit sentinel(sentinel_t<Base> end);   public: sentinel()=default;constexpr sentinel(sentinel<!Const> other) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;constexpr sentinel_t<Base> base()const;template<bool OtherConst> requires sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y);template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexpr range_difference_t<__maybe_const<OtherConst, V>> operator-(const iterator<OtherConst>& x, const sentinel& y);template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexpr range_difference_t<__maybe_const<OtherConst, V>> operator-(const sentinel& x, const iterator<OtherConst>& y);};}

[править]Шаблон класса std::ranges::zip_view

namespace std::ranges{template<class... Rs> concept __zip_is_common =// exposition only(sizeof...(Rs)==1&&(common_range<Rs>&& ...))||(!(bidirectional_range<Rs>&& ...)&&(common_range<Rs>&& ...))||((random_access_range<Rs>&& ...)&&(sized_range<Rs>&& ...));   template<input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)class zip_view :public view_interface<zip_view<Views...>>{ tuple<Views...> views_;// exposition only   // class template zip_view::iteratortemplate<bool>class iterator;// exposition only   // class template zip_view::sentineltemplate<bool>class sentinel;// exposition only   public: zip_view()=default;constexprexplicit zip_view(Views... views);   constexprauto begin() requires (!(__simple_view<Views>&& ...)){return iterator<false>(__tuple_transform(ranges::begin, views_));}constexprauto begin()const requires (range<const Views>&& ...){return iterator<true>(__tuple_transform(ranges::begin, views_));}   constexprauto end() requires (!(__simple_view<Views>&& ...)){ifconstexpr(!__zip_is_common<Views...>){return sentinel<false>(__tuple_transform(ranges::end, views_));}elseifconstexpr((random_access_range<Views>&& ...)){return begin()+ iter_difference_t<iterator<false>>(size());}else{return iterator<false>(__tuple_transform(ranges::end, views_));}}   constexprauto end()const requires (range<const Views>&& ...){ifconstexpr(!__zip_is_common<const Views...>){return sentinel<true>(__tuple_transform(ranges::end, views_));}elseifconstexpr((random_access_range<const Views>&& ...)){return begin()+ iter_difference_t<iterator<true>>(size());}else{return iterator<true>(__tuple_transform(ranges::end, views_));}}   constexprauto size() requires (sized_range<Views>&& ...);constexprauto size()const requires (sized_range<const Views>&& ...);};   template<class... Rs> zip_view(Rs&&...)-> zip_view<views::all_t<Rs>...>;}

[править]Шаблон класса std::ranges::zip_view::iterator

namespace std::ranges{template<bool Const, class... Views> concept __all_random_access =// exposition only(random_access_range<__maybe_const<Const, Views>>&& ...);template<bool Const, class... Views> concept __all_bidirectional =// exposition only(bidirectional_range<__maybe_const<Const, Views>>&& ...);template<bool Const, class... Views> concept __all_forward =// exposition only(forward_range<__maybe_const<Const, Views>>&& ...);   template<input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)template<bool Const>class zip_view<Views...>::iterator{ tuple<iterator_t<__maybe_const<Const, Views>>...> current_;// exposition onlyconstexprexplicit iterator(tuple<iterator_t<__maybe_const<Const, Views>>...>);// exposition onlypublic:using iterator_category = input_iterator_tag;// not always presentusing iterator_concept =/* see description */;using value_type = tuple<range_value_t<__maybe_const<Const, Views>>...>;using difference_type = common_type_t<range_difference_t< __maybe_const<Const, Views>>...>;   iterator()=default;constexpr iterator(iterator<!Const> i) requires Const &&(convertible_to<iterator_t<Views>, iterator_t<const Views>>&& ...);   constexprauto operator*()const;constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires __all_forward<Const, Views...>;   constexpr iterator& operator--() requires __all_bidirectional<Const, Views...>;constexpr iterator operator--(int) requires __all_bidirectional<Const, Views...>;   constexpr iterator& operator+=(difference_type x) requires __all_random_access<Const, Views...>;constexpr iterator& operator-=(difference_type x) requires __all_random_access<Const, Views...>;   constexprauto operator[](difference_type n)const requires __all_random_access<Const, Views...>;   friendconstexprbool operator==(const iterator& x, const iterator& y) requires (equality_comparable<iterator_t<__maybe_const<Const, Views>>>&& ...);   friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires __all_random_access<Const, Views...>;   friendconstexpr iterator operator+(const iterator& i, difference_type n) requires __all_random_access<Const, Views...>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires __all_random_access<Const, Views...>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires __all_random_access<Const, Views...>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires (sized_sentinel_for<iterator_t<__maybe_const<Const, Views>>, iterator_t<__maybe_const<Const, Views>>>&& ...);   friendconstexprauto iter_move(const iterator& i)noexcept(/* see description */);   friendconstexprvoid iter_swap(const iterator& l, const iterator& r)noexcept(/* see description */) requires (indirectly_swappable<iterator_t<__maybe_const<Const, Views>>>&& ...);};}

[править]Шаблон класса std::ranges::zip_view::sentinel

namespace std::ranges{template<input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)template<bool Const>class zip_view<Views...>::sentinel{ tuple<sentinel_t<__maybe_const<Const, Views>>...> end_;// exposition onlyconstexprexplicit sentinel(tuple<sentinel_t<__maybe_const<Const, Views>>...> end);// exposition onlypublic: sentinel()=default;constexpr sentinel(sentinel<!Const> i) requires Const &&(convertible_to<sentinel_t<Views>, sentinel_t<const Views>>&& ...);   template<bool OtherConst> requires (sentinel_for<sentinel_t<__maybe_const<Const, Views>>, iterator_t<__maybe_const<OtherConst, Views>>>&& ...)friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires (sized_sentinel_for<sentinel_t<__maybe_const<Const, Views>>, iterator_t<__maybe_const<OtherConst, Views>>>&& ...)friendconstexpr common_type_t<range_difference_t<__maybe_const<OtherConst, Views>>...> operator-(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires (sized_sentinel_for<sentinel_t<__maybe_const<Const, Views>>, iterator_t<__maybe_const<OtherConst, Views>>>&& ...)friendconstexpr common_type_t<range_difference_t<__maybe_const<OtherConst, Views>>...> operator-(const sentinel& y, const iterator<OtherConst>& x);};}

[править]Шаблон класса std::ranges::zip_transform_view

namespace std::ranges{template<move_constructible F, input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)&& is_object_v<F>&& regular_invocable<F&, range_reference_t<Views>...>&& __can_reference<invoke_result_t<F&, range_reference_t<Views>...>>class zip_transform_view :public view_interface<zip_transform_view<F, Views...>>{ __movable_box<F> fun_;// exposition only zip_view<Views...> zip_;// exposition only   using InnerView = zip_view<Views...>;// exposition onlytemplate<bool Const>using ziperator = iterator_t<__maybe_const<Const, InnerView>>;// exposition onlytemplate<bool Const>using zentinel = sentinel_t<__maybe_const<Const, InnerView>>;// exposition only   // class template zip_transform_view::iteratortemplate<bool>class iterator;// exposition only   // class template zip_transform_view::sentineltemplate<bool>class sentinel;// exposition only   public: zip_transform_view()=default;   constexprexplicit zip_transform_view(F fun, Views... views);   constexprauto begin(){return iterator<false>(*this, zip_.begin());}   constexprauto begin()const requires range<const InnerView>&& regular_invocable<const F&, range_reference_t<const Views>...>{return iterator<true>(*this, zip_.begin());}   constexprauto end(){ifconstexpr(common_range<InnerView>){return iterator<false>(*this, zip_.end());}else{return sentinel<false>(zip_.end());}}   constexprauto end()const requires range<const InnerView>&& regular_invocable<const F&, range_reference_t<const Views>...>{ifconstexpr(common_range<const InnerView>){return iterator<true>(*this, zip_.end());}else{return sentinel<true>(zip_.end());}}   constexprauto size() requires sized_range<InnerView>{return zip_.size();}   constexprauto size()const requires sized_range<const InnerView>{return zip_.size();}};   template<class F, class... Rs> zip_transform_view(F, Rs&&...)-> zip_transform_view<F, views::all_t<Rs>...>;}

[править]Шаблон класса std::ranges::zip_transform_view::iterator

namespace std::ranges{template<move_constructible F, input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)&& is_object_v<F>&& regular_invocable<F&, range_reference_t<Views>...>&& __can_reference<invoke_result_t<F&, range_reference_t<Views>...>>template<bool Const>class zip_transform_view<F, Views...>::iterator{using Parent = __maybe_const<Const, zip_transform_view>;// exposition onlyusing Base = __maybe_const<Const, InnerView>;// exposition only Parent* parent_ = nullptr;// exposition only ziperator<Const> inner_;// exposition only   constexpr iterator(Parent& parent, ziperator<Const> inner);// exposition only   public:using iterator_category =/* see description */;// not always presentusing iterator_concept =typename ziperator<Const>::iterator_concept;using value_type = remove_cvref_t<invoke_result_t<__maybe_const<Const, F>&, range_reference_t<__maybe_const<Const, Views>>...>>;using difference_type = range_difference_t<Base>;   iterator()=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<ziperator<false>, ziperator<Const>>;   constexpr decltype(auto) operator*()constnoexcept(/* see description */);constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<Base>;   constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;   constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>;   constexpr decltype(auto) operator[](difference_type n)const requires random_access_range<Base>;   friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<ziperator<Const>>;   friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>;   friendconstexpr iterator operator+(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<ziperator<Const>, ziperator<Const>>;};}

[править]Шаблон класса std::ranges::zip_transform_view::sentinel

namespace std::ranges{template<move_constructible F, input_range... Views> requires (view<Views>&& ...)&&(sizeof...(Views)>0)&& is_object_v<F>&& regular_invocable<F&, range_reference_t<Views>...>&& __can_reference<invoke_result_t<F&, range_reference_t<Views>...>>template<bool Const>class zip_transform_view<F, Views...>::sentinel{ zentinel<Const> inner_;// exposition onlyconstexprexplicit sentinel(zentinel<Const> inner);// exposition only   public: sentinel()=default;constexpr sentinel(sentinel<!Const> i) requires Const && convertible_to<zentinel<false>, zentinel<Const>>;   template<bool OtherConst> requires sentinel_for<zentinel<Const>, ziperator<OtherConst>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<zentinel<Const>, ziperator<OtherConst>>friendconstexpr range_difference_t<__maybe_const<OtherConst, InnerView>> operator-(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<zentinel<Const>, ziperator<OtherConst>>friendconstexpr range_difference_t<__maybe_const<OtherConst, InnerView>> operator-(const sentinel& x, const iterator<OtherConst>& y);};}

[править]Шаблон класса std::ranges::adjacent_view

namespace std::ranges{template<forward_range V, size_t N> requires view<V>&&(N >0)class adjacent_view :public view_interface<adjacent_view<V, N>>{ V base_ = V();// exposition only   // class template adjacent_view::iteratortemplate<bool>class iterator;// exposition only   // class template adjacent_view::sentineltemplate<bool>class sentinel;// exposition only   struct __as_sentinel{};// exposition only   public: adjacent_view() requires default_initializable<V>=default;constexprexplicit adjacent_view(V base);   constexprauto begin() requires (!__simple_view<V>){return iterator<false>(ranges::begin(base_), ranges::end(base_));}   constexprauto begin()const requires range<const V>{return iterator<true>(ranges::begin(base_), ranges::end(base_));}   constexprauto end() requires (!__simple_view<V>){ifconstexpr(common_range<V>){return iterator<false>(__as_sentinel{}, ranges::begin(base_), ranges::end(base_));}else{return sentinel<false>(ranges::end(base_));}}   constexprauto end()const requires range<const V>{ifconstexpr(common_range<const V>){return iterator<true>(__as_sentinel{}, ranges::begin(base_), ranges::end(base_));}else{return sentinel<true>(ranges::end(base_));}}   constexprauto size() requires sized_range<V>;constexprauto size()const requires sized_range<const V>;};}

[править]Шаблон класса std::ranges::adjacent_view::iterator

namespace std::ranges{template<forward_range V, size_t N> requires view<V>&&(N >0)template<bool Const>class adjacent_view<V, N>::iterator{using Base = __maybe_const<Const, V>;// exposition only array<iterator_t<Base>, N> current_ = array<iterator_t<Base>, N>();// exposition onlyconstexpr iterator(iterator_t<Base> first, sentinel_t<Base> last);// exposition onlyconstexpr iterator(__as_sentinel, iterator_t<Base> first, iterator_t<Base> last);// exposition onlypublic:using iterator_category = input_iterator_tag;using iterator_concept =/* see description */;using value_type = tuple<__REPEAT(range_value_t<Base>, N)...>;using difference_type = range_difference_t<Base>;   iterator()=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>;   constexprauto operator*()const;constexpr iterator& operator++();constexpr iterator operator++(int);   constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;   constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>;   constexprauto operator[](difference_type n)const requires random_access_range<Base>;   friendconstexprbool operator==(const iterator& x, const iterator& y);friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<iterator_t<Base>>;   friendconstexpr iterator operator+(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>;   friendconstexprauto iter_move(const iterator& i)noexcept(/* see description */);friendconstexprvoid iter_swap(const iterator& l, const iterator& r)noexcept(/* see description */) requires indirectly_swappable<iterator_t<Base>>;};}

[править]Шаблон класса std::ranges::adjacent_view::sentinel

namespace std::ranges{template<forward_range V, size_t N> requires view<V>&&(N >0)template<bool Const>class adjacent_view<V, N>::sentinel{using Base = __maybe_const<Const, V>;// exposition only sentinel_t<Base> end_ = sentinel_t<Base>();// exposition onlyconstexprexplicit sentinel(sentinel_t<Base> end);// exposition only   public: sentinel()=default;constexpr sentinel(sentinel<!Const> i) requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;   template<bool OtherConst> requires sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexpr range_difference_t<__maybe_const<OtherConst, V>> operator-(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<sentinel_t<Base>, iterator_t<__maybe_const<OtherConst, V>>>friendconstexpr range_difference_t<__maybe_const<OtherConst, V>> operator-(const sentinel& y, const iterator<OtherConst>& x);};}

[править]Шаблон класса std::ranges::adjacent_transform_view

namespace std::ranges{template<forward_range V, move_constructible F, size_t N> requires view<V>&&(N >0)&& is_object_v<F>&& regular_invocable<F&, __REPEAT(range_reference_t<V>, N)...>&& __can_reference<invoke_result_t<F&, __REPEAT(range_reference_t<V>, N)...>>class adjacent_transform_view :public view_interface<adjacent_transform_view<V, F, N>>{ __movable_box<F> fun_;// exposition only adjacent_view<V, N> inner_;// exposition only   using InnerView = adjacent_view<V, N>;// exposition onlytemplate<bool Const>using __inner_iterator = iterator_t<__maybe_const<Const, InnerView>>;// exposition onlytemplate<bool Const>using __inner_sentinel = sentinel_t<__maybe_const<Const, InnerView>>;// exposition only   // class template adjacent_transform_view::iteratortemplate<bool>class iterator;// exposition only   // class template adjacent_transform_view::sentineltemplate<bool>class sentinel;// exposition only   public: adjacent_transform_view()=default;constexprexplicit adjacent_transform_view(V base, F fun);   constexprauto begin(){return iterator<false>(*this, inner_.begin());}   constexprauto begin()const requires range<const InnerView>&& regular_invocable<const F&, __REPEAT(range_reference_t<const V>, N)...>{return iterator<true>(*this, inner_.begin());}   constexprauto end(){ifconstexpr(common_range<InnerView>){return iterator<false>(*this, inner_.end());}else{return sentinel<false>(inner_.end());}}   constexprauto end()const requires range<const InnerView>&& regular_invocable<const F&, __REPEAT(range_reference_t<const V>, N)...>{ifconstexpr(common_range<const InnerView>){return iterator<true>(*this, inner_.end());}else{return sentinel<true>(inner_.end());}}   constexprauto size() requires sized_range<InnerView>{return inner_.size();}   constexprauto size()const requires sized_range<const InnerView>{return inner_.size();}};}

[править]Шаблон класса std::ranges::adjacent_transform_view::iterator

namespace std::ranges{template<forward_range V, move_constructible F, size_t N> requires view<V>&&(N >0)&& is_object_v<F>&& regular_invocable<F&, __REPEAT(range_reference_t<V>, N)...>&& __can_reference<invoke_result_t<F&, __REPEAT(range_reference_t<V>, N)...>>template<bool Const>class adjacent_transform_view<V, F, N>::iterator{using Parent = __maybe_const<Const, adjacent_transform_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition only Parent* parent_ = nullptr;// exposition only __inner_iterator<Const> inner_;// exposition only   constexpr iterator(Parent& parent, __inner_iterator<Const> inner);// exposition only   public:using iterator_category =/* see description */;using iterator_concept =typename __inner_iterator<Const>::iterator_concept;using value_type = remove_cvref_t<invoke_result_t<__maybe_const<Const, F>&, __REPEAT(range_reference_t<Base>, N)...>>;using difference_type = range_difference_t<Base>;   iterator()=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<__inner_iterator<false>, __inner_iterator<Const>>;   constexpr decltype(auto) operator*()constnoexcept(/* see description */);constexpr iterator& operator++();constexpr iterator operator++(int);constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>;   constexpr decltype(auto) operator[](difference_type n)const requires random_access_range<Base>;   friendconstexprbool operator==(const iterator& x, const iterator& y);friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<__inner_iterator<Const>>;   friendconstexpr iterator operator+(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<__inner_iterator<Const>, __inner_iterator<Const>>;};}

[править]Шаблон класса std::ranges::adjacent_transform_view::sentinel

namespace std::ranges{template<forward_range V, move_constructible F, size_t N> requires view<V>&&(N >0)&& is_object_v<F>&& regular_invocable<F&, __REPEAT(range_reference_t<V>, N)...>&& __can_reference<invoke_result_t<F&, __REPEAT(range_reference_t<V>, N)...>>template<bool Const>class adjacent_transform_view<V, F, N>::sentinel{ __inner_sentinel<Const> inner_;// exposition onlyconstexprexplicit sentinel(__inner_sentinel<Const> inner);// exposition only   public: sentinel()=default;constexpr sentinel(sentinel<!Const> i) requires Const && convertible_to<__inner_sentinel<false>, __inner_sentinel<Const>>;   template<bool OtherConst> requires sentinel_for<__inner_sentinel<Const>, __inner_iterator<OtherConst>>friendconstexprbool operator==(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<__inner_sentinel<Const>, __inner_iterator<OtherConst>>friendconstexpr range_difference_t<__maybe_const<OtherConst, InnerView>> operator-(const iterator<OtherConst>& x, const sentinel& y);   template<bool OtherConst> requires sized_sentinel_for<__inner_sentinel<Const>, __inner_iterator<OtherConst>>friendconstexpr range_difference_t<__maybe_const<OtherConst, InnerView>> operator-(const sentinel& x, const iterator<OtherConst>& y);};}

[править]Шаблон класса std::ranges::chunk_view для input_ranges

namespace std::ranges{template<class I>constexpr I __div_ceil(I num, I denom){// exposition only I r = num / denom;if(num % denom)++r;return r;}   template<view V> requires input_range<V>class chunk_view :public view_interface<chunk_view<V>>{ V base_;// exposition only range_difference_t<V> n_;// exposition only range_difference_t<V> remainder_ =0;// exposition only   __non_propagating_cache<iterator_t<V>> current_;// exposition only   // class chunk_view::outer-iteratorclass __outer_iterator;// exposition only   // class chunk_view::inner-iteratorclass __inner_iterator;// exposition only   public:constexprexplicit chunk_view(V base, range_difference_t<V> n);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexpr __outer_iterator begin();constexpr default_sentinel_t end()constnoexcept;   constexprauto size() requires sized_range<V>;constexprauto size()const requires sized_range<const V>;};   template<class R> chunk_view(R&&, range_difference_t<R>)-> chunk_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::chunk_view::outer_iterator для input_ranges

namespace std::ranges{template<view V> requires input_range<V>class chunk_view<V>::__outer_iterator { chunk_view* parent_;// exposition only   constexprexplicit __outer_iterator(chunk_view& parent);// exposition only   public:using iterator_concept = input_iterator_tag;using difference_type = range_difference_t<V>;   // class chunk_view::outer-iterator::value_typestruct value_type;   __outer_iterator(__outer_iterator&&)=default; __outer_iterator& operator=(__outer_iterator&&)=default;   constexpr value_type operator*()const;constexpr __outer_iterator& operator++();constexprvoid operator++(int);   friendconstexprbool operator==(const __outer_iterator& x, default_sentinel_t);   friendconstexpr difference_type operator-(default_sentinel_t y, const __outer_iterator& x) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;friendconstexpr difference_type operator-(const __outer_iterator& x, default_sentinel_t y) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;};}

[править]Шаблон класса std::ranges::chunk_view::outer_iterator::value_type для input_ranges

namespace std::ranges{template<view V> requires input_range<V>struct chunk_view<V>::__outer_iterator::value_type: view_interface<value_type>{private: chunk_view* parent_;// exposition only   constexprexplicit value_type(chunk_view& parent);// exposition only   public:constexpr __inner_iterator begin()constnoexcept;constexpr default_sentinel_t end()constnoexcept;   constexprauto size()const requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;};}

[править]Шаблон класса std::ranges::chunk_view::inner_iterator для input_ranges

namespace std::ranges{template<view V> requires input_range<V>class chunk_view<V>::__inner_iterator { chunk_view* parent_;// exposition only   constexprexplicit __inner_iterator(chunk_view& parent)noexcept;// exposition only   public:using iterator_concept = input_iterator_tag;using difference_type = range_difference_t<V>;using value_type = range_value_t<V>;   __inner_iterator(__inner_iterator&&)=default; __inner_iterator& operator=(__inner_iterator&&)=default;   constexprconst iterator_t<V>& base()const&;   constexpr range_reference_t<V> operator*()const;constexpr __inner_iterator& operator++();constexprvoid operator++(int);   friendconstexprbool operator==(const __inner_iterator& x, default_sentinel_t);   friendconstexpr difference_type operator-(default_sentinel_t y, const __inner_iterator& x) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;friendconstexpr difference_type operator-(const __inner_iterator& x, default_sentinel_t y) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;};}

[править]Шаблон класса std::ranges::chunk_view для forward_ranges

namespace std::ranges{template<view V> requires forward_range<V>class chunk_view<V>:public view_interface<chunk_view<V>>{ V base_;// exposition only range_difference_t<V> n_;// exposition only   // class template chunk_view::iteratortemplate<bool>class iterator;// exposition only   public:constexprexplicit chunk_view(V base, range_difference_t<V> n);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprauto begin() requires (!__simple_view<V>){return iterator<false>(this, ranges::begin(base_));}   constexprauto begin()const requires forward_range<const V>{return iterator<true>(this, ranges::begin(base_));}   constexprauto end() requires (!__simple_view<V>){ifconstexpr(common_range<V>&& sized_range<V>){auto missing =(n_ -ranges::distance(base_)% n_)% n_;return iterator<false>(this, ranges::end(base_), missing);}elseifconstexpr(common_range<V>&&!bidirectional_range<V>){return iterator<false>(this, ranges::end(base_));}else{return default_sentinel;}}   constexprauto end()const requires forward_range<const V>{ifconstexpr(common_range<const V>&& sized_range<const V>){auto missing =(n_ -ranges::distance(base_)% n_)% n_;return iterator<true>(this, ranges::end(base_), missing);}elseifconstexpr(common_range<const V>&&!bidirectional_range<const V>){return iterator<true>(this, ranges::end(base_));}else{return default_sentinel;}}   constexprauto size() requires sized_range<V>;constexprauto size()const requires sized_range<const V>;};}

[править]Шаблон класса std::ranges::chunk_view::iterator для forward_ranges

namespace std::ranges{template<view V> requires forward_range<V>template<bool Const>class chunk_view<V>::iterator{using Parent = __maybe_const<Const, chunk_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition only   iterator_t<Base> current_ = iterator_t<Base>();// exposition only sentinel_t<Base> end_ = sentinel_t<Base>();// exposition only range_difference_t<Base> n_ =0;// exposition only range_difference_t<Base> missing_ =0;// exposition only   constexpr iterator(Parent* parent, iterator_t<Base> current, // exposition only range_difference_t<Base> missing =0);   public:using iterator_category = input_iterator_tag;using iterator_concept =/* see description */;using value_type = decltype(views::take(subrange(current_, end_), n_));using difference_type = range_difference_t<Base>;   iterator()=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>&& convertible_to<sentinel_t<V>, sentinel_t<Base>>;   constexpr iterator_t<Base> base()const;   constexpr value_type operator*()const;constexpr iterator& operator++();constexpr iterator operator++(int);   constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;   constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>;   constexpr value_type operator[](difference_type n)const requires random_access_range<Base>;   friendconstexprbool operator==(const iterator& x, const iterator& y);friendconstexprbool operator==(const iterator& x, default_sentinel_t);   friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<iterator_t<Base>>;   friendconstexpr iterator operator+(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>;   friendconstexpr difference_type operator-(default_sentinel_t y, const iterator& x) requires sized_sentinel_for<sentinel_t<Base>, iterator_t<Base>>;friendconstexpr difference_type operator-(const iterator& x, default_sentinel_t y) requires sized_sentinel_for<sentinel_t<Base>, iterator_t<Base>>;};}

[править]Шаблон класса std::ranges::slide_view

namespace std::ranges{template<class V> concept __slide_caches_nothing = random_access_range<V>&& sized_range<V>;// exposition only   template<class V> concept __slide_caches_last =// exposition only!__slide_caches_nothing<V>&& bidirectional_range<V>&& common_range<V>;   template<class V> concept __slide_caches_first =// exposition only!__slide_caches_nothing<V>&&!__slide_caches_last<V>;   template<forward_range V> requires view<V>class slide_view :public view_interface<slide_view<V>>{ V base_;// exposition only range_difference_t<V> n_;// exposition only   // class template slide_view::iteratortemplate<bool>class iterator;// exposition only   // class slide_view::sentinelclass sentinel;// exposition only   public:constexprexplicit slide_view(V base, range_difference_t<V> n);   constexprauto begin() requires (!(__simple_view<V>&& __slide_caches_nothing<const V>));constexprauto begin()const requires __slide_caches_nothing<const V>;   constexprauto end() requires (!(__simple_view<V>&& __slide_caches_nothing<const V>));constexprauto end()const requires __slide_caches_nothing<const V>;   constexprauto size() requires sized_range<V>;constexprauto size()const requires sized_range<const V>;};   template<class R> slide_view(R&&, range_difference_t<R>)-> slide_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::slide_view::iterator

namespace std::ranges{template<forward_range V> requires view<V>template<bool Const>class slide_view<V>::iterator{using Base = __maybe_const<Const, V>;// exposition only iterator_t<Base> current_ = iterator_t<Base>();// exposition only iterator_t<Base> last_ele_ = iterator_t<Base>();// exposition only,// present only if Base models slide-caches-first range_difference_t<Base> n_ =0;// exposition only   constexpr iterator(iterator_t<Base> current, // exposition only range_difference_t<Base> n) requires (!__slide_caches_first<Base>);   constexpr iterator(iterator_t<Base> current, // exposition only iterator_t<Base> last_ele, range_difference_t<Base> n) requires __slide_caches_first<Base>;   public:using iterator_category = input_iterator_tag;using iterator_concept =/* see description */;using value_type = decltype(views::counted(current_, n_));using difference_type = range_difference_t<Base>;   iterator()=default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>;   constexprauto operator*()const;constexpr iterator& operator++();constexpr iterator operator++(int);   constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;   constexpr iterator& operator+=(difference_type x) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type x) requires random_access_range<Base>;   constexprauto operator[](difference_type n)const requires random_access_range<Base>;   friendconstexprbool operator==(const iterator& x, const iterator& y);   friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<iterator_t<Base>>;   friendconstexpr iterator operator+(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, const iterator& i) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& i, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>;};}

[править]Шаблон класса std::ranges::slide_view::sentinel

namespace std::ranges{template<forward_range V> requires view<V>class slide_view<V>::sentinel{ sentinel_t<V> end_ = sentinel_t<V>();// exposition onlyconstexprexplicit sentinel(sentinel_t<V> end);// exposition only   public: sentinel()=default;   friendconstexprbool operator==(const iterator<false>& x, const sentinel& y);   friendconstexpr range_difference_t<V> operator-(const iterator<false>& x, const sentinel& y) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;   friendconstexpr range_difference_t<V> operator-(const sentinel& y, const iterator<false>& x) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;};}

[править]Шаблон класса std::ranges::chunk_by_view

namespace std::ranges{template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class chunk_by_view :public view_interface<chunk_by_view<V, Pred>>{ V base_ = V();// exposition only __movable_box<Pred> pred_ = Pred();// exposition only   // class chunk_by_view::iteratorclass iterator;// exposition only   public: chunk_by_view() requires default_initializable<V>&& default_initializable<Pred>=default;constexprexplicit chunk_by_view(V base, Pred pred);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexprconst Pred& pred()const;   constexpr iterator begin();constexprauto end();   constexpr iterator_t<V> __find_next(iterator_t<V>);// exposition onlyconstexpr iterator_t<V> __find_prev(iterator_t<V>)// exposition only requires bidirectional_range<V>;};   template<class R, class Pred> chunk_by_view(R&&, Pred)-> chunk_by_view<views::all_t<R>, Pred>;}

[править]Шаблон класса std::ranges::chunk_by_view::iterator

namespace std::ranges{template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred> requires view<V>&& is_object_v<Pred>class chunk_by_view<V, Pred>::iterator{ chunk_by_view* parent_ = nullptr;// exposition only iterator_t<V> current_ = iterator_t<V>();// exposition only iterator_t<V> next_ = iterator_t<V>();// exposition only   constexpr iterator(chunk_by_view& parent, iterator_t<V> current, // exposition only iterator_t<V> next);   public:using value_type = subrange<iterator_t<V>>;using difference_type = range_difference_t<V>;using iterator_category = input_iterator_tag;using iterator_concept =/* see description */;   iterator()=default;   constexpr value_type operator*()const;constexpr iterator& operator++();constexpr iterator operator++(int);   constexpr iterator& operator--() requires bidirectional_range<V>;constexpr iterator operator--(int) requires bidirectional_range<V>;   friendconstexprbool operator==(const iterator& x, const iterator& y);friendconstexprbool operator==(const iterator& x, default_sentinel_t);};}

[править]Шаблон класса std::ranges::stride_view

namespace std::ranges{template<input_range V> requires view<V>class stride_view :public view_interface<stride_view<V>>{ V base_;// exposition only range_difference_t<V> stride_;// exposition only// class template stride_view::iteratortemplate<bool>class iterator;// exposition onlypublic:constexprexplicit stride_view(V base, range_difference_t<V> stride);   constexpr V base()const& requires copy_constructible<V>{return base_;}constexpr V base()&&{return std::move(base_);}   constexpr range_difference_t<V> stride()constnoexcept;   constexprauto begin() requires (!__simple_view<V>){return iterator<false>(this, ranges::begin(base_));}   constexprauto begin()const requires range<const V>{return iterator<true>(this, ranges::begin(base_));}   constexprauto end() requires (!__simple_view<V>){ifconstexpr(common_range<V>&& sized_range<V>&& forward_range<V>){auto missing =(stride_ -ranges::distance(base_)% stride_)% stride_;return iterator<false>(this, ranges::end(base_), missing);}elseifconstexpr(common_range<V>&&!bidirectional_range<V>){return iterator<false>(this, ranges::end(base_));}else{return default_sentinel;}}   constexprauto end()const requires range<const V>{ifconstexpr(common_range<const V>&& sized_range<const V>&& forward_range<const V>){auto missing =(stride_ -ranges::distance(base_)% stride_)% stride_;return iterator<true>(this, ranges::end(base_), missing);}elseifconstexpr(common_range<const V>&&!bidirectional_range<const V>){return iterator<true>(this, ranges::end(base_));}else{return default_sentinel;}}   constexprauto size() requires sized_range<V>;constexprauto size()const requires sized_range<const V>;};   template<class R> stride_view(R&&, range_difference_t<R>)-> stride_view<views::all_t<R>>;}

[править]Шаблон класса std::ranges::stride_view::iterator

namespace std::ranges{template<input_range V> requires view<V>template<bool Const>class stride_view<V>::iterator{using Parent = __maybe_const<Const, stride_view>;// exposition onlyusing Base = __maybe_const<Const, V>;// exposition only   iterator_t<Base> current_ = iterator_t<Base>();// exposition only sentinel_t<Base> end_ = sentinel_t<Base>();// exposition only range_difference_t<Base> stride_ =0;// exposition only range_difference_t<Base> missing_ =0;// exposition only   constexpr iterator(Parent* parent, iterator_t<Base> current, // exposition only range_difference_t<Base> missing =0);public:using difference_type = range_difference_t<Base>;using value_type = range_value_t<Base>;using iterator_concept =/* see description */;using iterator_category =/* see description */;// not always present   iterator() requires default_initializable<iterator_t<Base>>=default;   constexpr iterator(iterator<!Const> other) requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>&& convertible_to<sentinel_t<V>, sentinel_t<Base>>;   constexpr iterator_t<Base> base()&&;constexprconst iterator_t<Base>& base()const&noexcept;   constexpr decltype(auto) operator*()const{return*current_;}   constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<Base>;   constexpr iterator& operator--() requires bidirectional_range<Base>;constexpr iterator operator--(int) requires bidirectional_range<Base>;   constexpr iterator& operator+=(difference_type n) requires random_access_range<Base>;constexpr iterator& operator-=(difference_type n) requires random_access_range<Base>;   constexpr decltype(auto) operator[](difference_type n)const requires random_access_range<Base>{return*(*this + n);}   friendconstexprbool operator==(const iterator& x, default_sentinel_t);   friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<iterator_t<Base>>;   friendconstexprbool operator<(const iterator& x, const iterator& y) requires random_access_range<Base>;   friendconstexprbool operator>(const iterator& x, const iterator& y) requires random_access_range<Base>;   friendconstexprbool operator<=(const iterator& x, const iterator& y) requires random_access_range<Base>;   friendconstexprbool operator>=(const iterator& x, const iterator& y) requires random_access_range<Base>;   friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires random_access_range<Base>&& three_way_comparable<iterator_t<Base>>;   friendconstexpr iterator operator+(const iterator& x, difference_type n) requires random_access_range<Base>;friendconstexpr iterator operator+(difference_type n, const iterator& x) requires random_access_range<Base>;friendconstexpr iterator operator-(const iterator& x, difference_type n) requires random_access_range<Base>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires sized_sentinel_for<iterator_t<Base>, iterator_t<Base>>;   friendconstexpr difference_type operator-(default_sentinel_t y, const iterator& x) requires sized_sentinel_for<sentinel_t<Base>, iterator_t<Base>>;friendconstexpr difference_type operator-(const iterator& x, default_sentinel_t y) requires sized_sentinel_for<sentinel_t<Base>, iterator_t<Base>>;   friendconstexpr range_rvalue_reference_t<Base> iter_move(const iterator& i)noexcept(noexcept(ranges::iter_move(i.current_)));   friendconstexprvoid iter_swap(const iterator& x, const iterator& y)noexcept(noexcept(ranges::iter_swap(x.current_, y.current_))) requires indirectly_swappable<iterator_t<Base>>;};}

[править]Шаблон класса std::ranges::cartesian_product_view

namespace std::ranges{template<bool Const, class First, class... Vs> concept __cartesian_product_is_random_access =// exposition only(random_access_range<__maybe_const<Const, First>>&& ... &&(random_access_range<__maybe_const<Const, Vs>>&& sized_range<__maybe_const<Const, Vs>>));   template<class R> concept __cartesian_product_common_arg =// exposition only common_range<R>||(sized_range<R>&& random_access_range<R>);   template<bool Const, class First, class... Vs> concept __cartesian_product_is_bidirectional =// exposition only(bidirectional_range<__maybe_const<Const, First>>&& ... &&(bidirectional_range<__maybe_const<Const, Vs>>&& __cartesian_product_common_arg<__maybe_const<Const, Vs>>));   template<class First, class... Vs> concept __cartesian_product_is_common =// exposition only __cartesian_product_common_arg<First>;   template<class... Vs> concept __cartesian_product_is_sized =// exposition only(sized_range<Vs>&& ...);   template<bool Const, template<class>class FirstSent, class First, class... Vs> concept __cartesian_is_sized_sentinel =// exposition only(sized_sentinel_for<FirstSent<__maybe_const<Const, First>>, iterator_t<__maybe_const<Const, First>>>&& ... &&(sized_range<__maybe_const<Const, Vs>>&& sized_sentinel_for<iterator_t<__maybe_const<Const, Vs>>, iterator_t<__maybe_const<Const, Vs>>>));   template<__cartesian_product_common_arg R>constexprauto __cartesian_common_arg_end(R& r){// exposition onlyifconstexpr(common_range<R>){returnranges::end(r);}else{returnranges::begin(r)+ranges::distance(r);}}   template<input_range First, forward_range... Vs> requires (view<First>&& ... && view<Vs>)class cartesian_product_view :public view_interface<cartesian_product_view<First, Vs...>>{private: tuple<First, Vs...> bases_;// exposition only// class template cartesian_product_view::iteratortemplate<bool Const>class iterator;// exposition onlypublic:constexpr cartesian_product_view()=default;constexprexplicit cartesian_product_view(First first_base, Vs... bases);   constexpr iterator<false> begin() requires (!__simple_view<First>|| ... ||!__simple_view<Vs>);constexpr iterator<true> begin()const requires (range<const First>&& ... && range<const Vs>);   constexpr iterator<false> end() requires ((!__simple_view<First>|| ... ||!__simple_view<Vs>)&& __cartesian_product_is_common<First, Vs...>);constexpr iterator<true> end()const requires __cartesian_product_is_common<const First, const Vs...>;constexpr default_sentinel_t end()constnoexcept;   constexpr/* see description */ size() requires __cartesian_product_is_sized<First, Vs...>;constexpr/* see description */ size()const requires __cartesian_product_is_sized<const First, const Vs...>;};   template<class... Vs> cartesian_product_view(Vs&&...)-> cartesian_product_view<all_t<Vs>...>;}

[править]Шаблон класса std::ranges::cartesian_product_view::iterator

namespace std::ranges{template<input_range First, forward_range... Vs> requires (view<First>&& ... && view<Vs>)template<bool Const>class cartesian_product_view<First, Vs...>::iterator{public:using iterator_category = input_iterator_tag;using iterator_concept =/* see description */;using value_type = tuple<range_value_t<__maybe_const<Const, First>>, range_value_t<__maybe_const<Const, Vs>>...>;using reference = tuple<range_reference_t<__maybe_const<Const, First>>, range_reference_t<__maybe_const<Const, Vs>>...>;using difference_type =/* see description */;   iterator() requires forward_range<__maybe_const<Const, First>>=default;   constexpr iterator(iterator<!Const> i) requires Const &&(convertible_to<iterator_t<First>, iterator_t<const First>>&& ... && convertible_to<iterator_t<Vs>, iterator_t<const Vs>>);   constexprauto operator*()const;constexpr iterator& operator++();constexprvoid operator++(int);constexpr iterator operator++(int) requires forward_range<__maybe_const<Const, First>>;   constexpr iterator& operator--() requires __cartesian_product_is_bidirectional<Const, First, Vs...>;constexpr iterator operator--(int) requires __cartesian_product_is_bidirectional<Const, First, Vs...>;   constexpr iterator& operator+=(difference_type x) requires __cartesian_product_is_random_access<Const, First, Vs...>;constexpr iterator& operator-=(difference_type x) requires __cartesian_product_is_random_access<Const, First, Vs...>;   constexpr reference operator[](difference_type n)const requires __cartesian_product_is_random_access<Const, First, Vs...>;   friendconstexprbool operator==(const iterator& x, const iterator& y) requires equality_comparable<iterator_t<__maybe_const<Const, First>>>;   friendconstexprbool operator==(const iterator& x, default_sentinel_t);   friendconstexprauto operator<=>(const iterator& x, const iterator& y) requires __all_random_access<Const, First, Vs...>;   friendconstexpr iterator operator+(const iterator& x, difference_type y) requires __cartesian_product_is_random_access<Const, First, Vs...>;friendconstexpr iterator operator+(difference_type x, const iterator& y) requires __cartesian_product_is_random_access<Const, First, Vs...>;friendconstexpr iterator operator-(const iterator& x, difference_type y) requires __cartesian_product_is_random_access<Const, First, Vs...>;friendconstexpr difference_type operator-(const iterator& x, const iterator& y) requires __cartesian_is_sized_sentinel<Const, iterator_t, First, Vs...>;   friendconstexpr difference_type operator-(iterator i, default_sentinel_t) requires __cartesian_is_sized_sentinel<Const, sentinel_t, First, Vs...>;friendconstexpr difference_type operator-(default_sentinel_t, iterator i) requires __cartesian_is_sized_sentinel<Const, sentinel_t, First, Vs...>;   friendconstexprauto iter_move(const iterator& i)noexcept(/* see description */);   friendconstexprvoid iter_swap(const iterator& l, const iterator& r)noexcept(/* see description */) requires (indirectly_swappable<iterator_t<__maybe_const<Const, First>>>&& ... && indirectly_swappable<iterator_t<__maybe_const<Const, Vs>>>);   private: __maybe_const<Const, cartesian_product_view>* parent_ = nullptr;// exposition only tuple<iterator_t<__maybe_const<Const, First>>, iterator_t<__maybe_const<Const, Vs>>...> current_;// exposition only   template<size_t N = sizeof...(Vs)>constexprvoid next();// exposition only   template<size_t N = sizeof...(Vs)>constexprvoid prev();// exposition only   template<class Tuple>constexpr difference_type __distance_from(Tuple t);// exposition only   constexprexplicit iterator(tuple<iterator_t<__maybe_const<Const, First>>, iterator_t<__maybe_const<Const, Vs>>...> current);// exposition only};}

[править]Отчеты об ошибках

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 3914 C++23 ограничение std::ranges::enumerate_view
в аннотации неверно указано
исправлено
close