Namespaces
Variants

std::ranges::join_with_view<V,Pattern>::iterator<Const>::iterator

Начиная с ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
/*iterator*/() = default;
(1) (начиная с C++23)
constexpr /*iterator*/( /*iterator*/<!Const> i )
    requires Const &&
        std::convertible_to<ranges::iterator_t<V>, /*OuterIter*/> &&
        std::convertible_to<ranges::iterator_t</*InnerRng*/>,
                            /*InnerIter*/> &&
        std::convertible_to<ranges::iterator_t<Pattern>, /*PatternIter*/>;
(2) (начиная с C++23)
constexpr /*iterator*/( /*Parent*/& parent, /*OuterIter*/ outer )
    requires std::forward_range</*Base*/>;
(3) (начиная с C++23)
(только для пояснения*)
constexpr explicit /*iterator*/( /*Parent*/ parent )
    requires (!std::forward_range</*Base*/>);
(4) (начиная с C++23)
(только для пояснения*)

Конструирование итератора. Перегрузки (3,4) вызываются begin() и end() из ranges::join_with_view.

 Перегрузка  Элементы данных
parent_ outer_it_ inner_it_
(1) инициализируется с помощью nullptr value-инициализации
(только если Base моделирует forward_range)
 инициализации по умолчанию 
(2) инициализируется с помощью i.parent_  инициализируется с помощью std::move(i.outer_it_ 
(только если Base моделирует forward_range)
(3) инициализируется с помощью
 std::addressof(parent) 
инициализируется с помощью std::move(outer)
(4) Н/П
2) После инициализации элементов данных эквивалентно

if (i.inner_it_ .index() == 0)
    inner_it_ .template emplace<0>(std::get<0>(std::move(i.inner_it_ )));
else
    inner_it_ .template emplace<1>(std::get<1>(std::move(i.inner_it_ ))); .

3,4) После инициализации элементов данных настроить внешний итератор так, как если бы внутренний итератор был инкрементирован на operator++().

Параметры

i - изменяемый итератор
parent - объект std::ranges::join_with_view
outer - итератор базового диапазона parent

Пример