[range.subrange.access] # 25 Ranges library [[ranges]](./#ranges) ## 25.5 Range utilities [[range.utility]](range.utility#range.subrange.access) ### 25.5.4 Sub-ranges [[range.subrange]](range.subrange#access) #### 25.5.4.3 Accessors [range.subrange.access] [🔗](#lib:begin,subrange) `constexpr I begin() const requires [copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]"); ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2100) *Effects*: Equivalent to: return *begin_*; [🔗](#lib:begin,subrange_) `constexpr I begin() requires (![copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]")); ` [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2111) *Effects*: Equivalent to: return std​::​move(*begin_*); [🔗](#lib:end,subrange) `constexpr S end() const; ` [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2122) *Effects*: Equivalent to: return *end_*; [🔗](#lib:empty,subrange) `constexpr bool empty() const; ` [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2133) *Effects*: Equivalent to: return *begin_* == *end_*; [🔗](#lib:size,subrange) `constexpr make-unsigned-like-t> size() const requires (K == subrange_kind::sized); ` [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2145) *Effects*: - [(5.1)](#5.1) If *StoreSize* is true, equivalent to: return *size_*; - [(5.2)](#5.2) Otherwise, equivalent to: return *to-unsigned-like*(*end_* - *begin_*); [🔗](#lib:next,subrange) `constexpr subrange next(iter_difference_t n = 1) const & requires [forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_­iterator [iterator.concept.forward]"); ` [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2160) *Effects*: Equivalent to:auto tmp = *this; tmp.advance(n);return tmp; [🔗](#lib:next,subrange_) `constexpr subrange next(iter_difference_t n = 1) &&; ` [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2176) *Effects*: Equivalent to:advance(n);return std::move(*this); [🔗](#lib:prev,subrange) `constexpr subrange prev(iter_difference_t n = 1) const requires [bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_­iterator [iterator.concept.bidir]"); ` [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2192) *Effects*: Equivalent to:auto tmp = *this; tmp.advance(-n);return tmp; [🔗](#lib:advance,subrange) `constexpr subrange& advance(iter_difference_t n); ` [9](#9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2208) *Effects*: Equivalent to:if constexpr ([bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_­iterator [iterator.concept.bidir]")) {if (n < 0) { ranges::advance(*begin_*, n); if constexpr (*StoreSize*)*size_* += *to-unsigned-like*(-n); return *this; }}auto d = n - ranges::advance(*begin_*, n, *end_*);if constexpr (*StoreSize*)*size_* -= *to-unsigned-like*(d);return *this; [🔗](#lib:get,subrange) `template requires ((N == 0 && [copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]")) || N == 1) constexpr auto get(const subrange& r); template requires (N < 2) constexpr auto get(subrange&& r); ` [10](#10) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2239) *Effects*: Equivalent to:if constexpr (N == 0)return r.begin();elsereturn r.end();