std::ranges::join_view<V>::sentinel
From cppreference.com
                    
                                        
                    
                    
                                                            
                    | template< bool Const > class /*sentinel*/ | (since C++20) (exposition only*) | |
The return type of join_view::end when either of the underlying ranges (V or ranges::range_reference_t<V>) is not a common_range, or when the parent join_view is not a forward_range.
If V is not a simple view, Const is true for sentinels returned from the const overloads, and false otherwise. If V is a simple view, Const is true.
Typical implementation holds only one data member:
-  end_(exposition only*) - A sentinel obtained from (possibly const-qualified)V.
Member types
| Member type | Definition | 
| Parent | const ranges::join_view<V> if Const is true, otherwise ranges::join_view<V> (exposition only*) | 
| Base | const V if Const is true, otherwise V (exposition only*) | 
Member functions
| (C++20) | constructs a sentinel (public member function) | 
Non-member functions
| (C++20) | compares a sentinel with an iterator returned from join_view::begin (function) |