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

From cppreference.com
 
 
Ranges library
Range adaptors
 
 
/*iterator*/() = default;
(1) (since 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) (since C++23)
constexpr /*iterator*/( /*Parent*/& parent, /*OuterIter*/ outer )
    requires std::forward_range</*Base*/>;
(3) (since C++23)
(exposition only*)
constexpr explicit /*iterator*/( /*Parent*/ parent )
    requires (!std::forward_range</*Base*/>);
(4) (since C++23)
(exposition only*)

Construct an iterator. Overloads (3,4) are called by begin() and end() of ranges::join_with_view.

 Overload  Data members
parent_ outer_it_ inner_it_
(1) initialized with nullptr value-initialized
(only if Base models forward_range)
 default-initialized 
(2) initialized with i.parent_  initialized with std::move(i.outer_it_ 
(only if Base models forward_range)
(3) initialized with
 std::addressof(parent) 
initialized with std::move(outer)
(4) N/A
2) After initializing the data members, equivalent to

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) After initializing the data members, adjust the outer iterator as if the inner iterator was incremented by operator++().

Parameters

i - a mutable iterator
parent - a std::ranges::join_with_view object
outer - an iterator into the underlying range of parent

Example