Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
/*iterator*/ ( ) = default ;
(1) (начиная с C++23)
constexpr /*iterator*/ ( /*iterator*/ < ! Const > i )

требует 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 )
требует std:: forward_range < /*Base*/ > ;
(3) (начиная с C++23)
( только для демонстрации* )
constexpr explicit /*iterator*/ ( /*Parent*/ parent )
требует ( ! std:: forward_range < /*Base*/ > ) ;
(4) (начиная с C++23)
( только для демонстрации* )

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

Перегрузка Члены данных
parent_ outer_it_ inner_it_
(1) инициализирован с nullptr инициализирован значением
(только если 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

Пример