[range.subrange.ctor] # 25 Ranges library [[ranges]](./#ranges) ## 25.5 Range utilities [[range.utility]](range.utility#range.subrange.ctor) ### 25.5.4 Sub-ranges [[range.subrange]](range.subrange#ctor) #### 25.5.4.2 Constructors and conversions [range.subrange.ctor] [🔗](#lib:subrange,constructor) `constexpr subrange([convertible-to-non-slicing](range.subrange.general#concept:convertible-to-non-slicing "25.5.4.1 General [range.subrange.general]") auto i, S s) requires (!StoreSize); ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2020) *Preconditions*: [i, s) is a valid range[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2024) *Effects*: Initializes *begin_* with std​::​move(i) and *end_* withs[.](#2.sentence-1) [🔗](#lib:subrange,constructor_) `constexpr subrange([convertible-to-non-slicing](range.subrange.general#concept:convertible-to-non-slicing "25.5.4.1 General [range.subrange.general]") auto i, S s, make-unsigned-like-t> n) requires (K == subrange_kind::sized); ` [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2038) *Preconditions*: [i, s) is a valid range, andn == *to-unsigned-like*(ranges​::​distance(i, s)) is true[.](#3.sentence-1) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2044) *Effects*: Initializes *begin_* with std​::​move(i) and *end_* withs[.](#4.sentence-1) If *StoreSize* is true, initializes *size_* withn[.](#4.sentence-2) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2050) [*Note [1](#note-1)*: Accepting the length of the range and storing it to later return fromsize() enables subrange to model [sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]") even when it stores an iterator and sentinel that do not model[sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]")[.](#5.sentence-1) — *end note*] [🔗](#lib:subrange,constructor__) `template<[different-from](range.utility.helpers#concept:different-from "25.5.2 Helper concepts [range.utility.helpers]") R> requires [borrowed_range](range.range#concept:borrowed_range "25.4.2 Ranges [range.range]") && [convertible-to-non-slicing](range.subrange.general#concept:convertible-to-non-slicing "25.5.4.1 General [range.subrange.general]"), I> && [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_­to [concept.convertible]"), S> constexpr subrange(R&& r) requires (!StoreSize || [sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]")); ` [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2069) *Effects*: Equivalent to: - [(6.1)](#6.1) If *StoreSize* is true,subrange(r, static_cast(ranges​::​size(r)))[.](#6.1.sentence-1) - [(6.2)](#6.2) Otherwise, subrange(ranges​::​begin(r), ranges​::​end(r))[.](#6.2.sentence-1) [🔗](#lib:operator_PairLike,subrange) `template<[different-from](range.utility.helpers#concept:different-from "25.5.2 Helper concepts [range.utility.helpers]") PairLike> requires [pair-like-convertible-from](range.subrange.general#concept:pair-like-convertible-from "25.5.4.1 General [range.subrange.general]") constexpr operator PairLike() const; ` [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L2087) *Effects*: Equivalent to: return PairLike(*begin_*, *end_*);