Files
2025-10-25 03:02:53 +03:00

25 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[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.6Other range refinements[range.refinements]") V>requires [view](range.view#concept:view "25.4.5Views[range.view]")<V> && [input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]")<range_reference_t<V>>class join_view : public view_interface<join_view<V>> {private:using *InnerRng* = range_reference_t<V>; // *exposition only*// [[range.join.iterator]](range.join.iterator "25.7.14.3Class template join_­view::iterator"), class template join_view::*iterator*template<bool Const>struct *iterator*; // *exposition only*// [[range.join.sentinel]](range.join.sentinel "25.7.14.4Class template join_­view::sentinel"), class template join_view::*sentinel*template<bool Const>struct *sentinel*; // *exposition only* V *base_* = V(); // *exposition only**non-propagating-cache*<iterator_t<V>> *outer_*; // *exposition only*, present only// when ![forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<V>*non-propagating-cache*<remove_cv_t<*InnerRng*>> *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.12Concept default_­initializable[concept.default.init]")<V> = default; constexpr explicit join_view(V base); constexpr V base() const & requires [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14Concept copy_­constructible[concept.copyconstructible]")<V> { return *base_*; }constexpr V base() && { return std::move(*base_*); }constexpr auto begin() {if constexpr ([forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<V>) {constexpr bool use_const = [*simple-view*](range.utility.helpers#concept:simple-view "25.5.2Helper concepts[range.utility.helpers]")<V> && is_reference_v<*InnerRng*>; return *iterator*<use_const>{*this, ranges::begin(*base_*)}; } else {*outer_* = ranges::begin(*base_*); return *iterator*<false>{*this}; }}constexpr auto begin() constrequires [forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<const V> && is_reference_v<range_reference_t<const V>> &&[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]")<range_reference_t<const V>>{ return *iterator*<true>{*this, ranges::begin(*base_*)}; }constexpr auto end() {if constexpr ([forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<V> && is_reference_v<*InnerRng*> && [forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<*InnerRng*> &&[common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<V> && [common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<*InnerRng*>)return *iterator*<[*simple-view*](range.utility.helpers#concept:simple-view "25.5.2Helper concepts[range.utility.helpers]")<V>>{*this, ranges::end(*base_*)}; elsereturn *sentinel*<[*simple-view*](range.utility.helpers#concept:simple-view "25.5.2Helper concepts[range.utility.helpers]")<V>>{*this}; }constexpr auto end() constrequires [forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<const V> && is_reference_v<range_reference_t<const V>> &&[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]")<range_reference_t<const V>> {if constexpr ([forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<range_reference_t<const V>> &&[common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<const V> &&[common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<range_reference_t<const V>>)return *iterator*<true>{*this, ranges::end(*base_*)}; elsereturn *sentinel*<true>{*this}; }}; template<class R>explicit join_view(R&&) -> join_view<views::all_t<R>>;}
[🔗](#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)