[range.join.view] # 25 Ranges library [[ranges]](./#ranges) ## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.join.view) ### 25.7.14 Join view [[range.join]](range.join#view) #### 25.7.14.2 Class template join_view [range.join.view] [🔗](#lib:join_view) namespace std::ranges {template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") V>requires [view](range.view#concept:view "25.4.5 Views [range.view]") && [input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")>class join_view : public view_interface> {private:using *InnerRng* = range_reference_t; // *exposition only*// [[range.join.iterator]](range.join.iterator "25.7.14.3 Class template join_­view​::​iterator"), class template join_view​::​*iterator*templatestruct *iterator*; // *exposition only*// [[range.join.sentinel]](range.join.sentinel "25.7.14.4 Class template join_­view​::​sentinel"), class template join_view​::​*sentinel*templatestruct *sentinel*; // *exposition only* V *base_* = V(); // *exposition only**non-propagating-cache*> *outer_*; // *exposition only*, present only// when ![forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")*non-propagating-cache*> *inner_*; // *exposition only*, present only// if is_reference_v<*InnerRng*> is falsepublic: join_view() requires [default_initializable](concept.default.init#concept:default_initializable "18.4.12 Concept default_­initializable [concept.default.init]") = default; constexpr explicit join_view(V base); constexpr V base() const & requires [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_­constructible [concept.copyconstructible]") { return *base_*; }constexpr V base() && { return std::move(*base_*); }constexpr auto begin() {if constexpr ([forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")) {constexpr bool use_const = [*simple-view*](range.utility.helpers#concept:simple-view "25.5.2 Helper concepts [range.utility.helpers]") && is_reference_v<*InnerRng*>; return *iterator*{*this, ranges::begin(*base_*)}; } else {*outer_* = ranges::begin(*base_*); return *iterator*{*this}; }}constexpr auto begin() constrequires [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") && is_reference_v> &&[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")>{ return *iterator*{*this, ranges::begin(*base_*)}; }constexpr auto end() {if constexpr ([forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") && is_reference_v<*InnerRng*> && [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<*InnerRng*> &&[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]") && [common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")<*InnerRng*>)return *iterator*<[*simple-view*](range.utility.helpers#concept:simple-view "25.5.2 Helper concepts [range.utility.helpers]")>{*this, ranges::end(*base_*)}; elsereturn *sentinel*<[*simple-view*](range.utility.helpers#concept:simple-view "25.5.2 Helper concepts [range.utility.helpers]")>{*this}; }constexpr auto end() constrequires [forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") && is_reference_v> &&[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]")> {if constexpr ([forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")> &&[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]") &&[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]")>)return *iterator*{*this, ranges::end(*base_*)}; elsereturn *sentinel*{*this}; }}; templateexplicit join_view(R&&) -> join_view>;} [🔗](#lib:join_view,constructor) `constexpr explicit join_view(V base); ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L6756) *Effects*: Initializes *base_* with std​::​move(base)[.](#1.sentence-1)