[range.elements.sentinel] # 25 Ranges library [[ranges]](./#ranges) ## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.elements.sentinel) ### 25.7.23 Elements view [[range.elements]](range.elements#sentinel) #### 25.7.23.4 Class template elements_view​::​*sentinel* [range.elements.sentinel] [🔗](#lib:elements_view::sentinel) namespace std::ranges {template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") V, size_t N>requires [view](range.view#concept:view "25.4.5 Views [range.view]") && [*has-tuple-element*](range.elements.view#concept:has-tuple-element "25.7.23.2 Class template elements_­view [range.elements.view]"), N> &&[*has-tuple-element*](range.elements.view#concept:has-tuple-element "25.7.23.2 Class template elements_­view [range.elements.view]")>, N> &&[*returnable-element*](range.elements.view#concept:returnable-element "25.7.23.2 Class template elements_­view [range.elements.view]"), N>templateclass elements_view::*sentinel* {private:using *Base* = *maybe-const*; // *exposition only* sentinel_t<*Base*> *end_* = sentinel_t<*Base*>(); // *exposition only*public:*sentinel*() = default; constexpr explicit *sentinel*(sentinel_t<*Base*> end); constexpr *sentinel*(*sentinel* other)requires Const && [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_­to [concept.convertible]"), sentinel_t<*Base*>>; constexpr sentinel_t<*Base*> base() const; templaterequires [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]"), iterator_t<*maybe-const*>>friend constexpr bool operator==(const *iterator*& x, const *sentinel*& y); templaterequires [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]"), iterator_t<*maybe-const*>>friend constexpr range_difference_t<*maybe-const*>operator-(const *iterator*& x, const *sentinel*& y); templaterequires [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]"), iterator_t<*maybe-const*>>friend constexpr range_difference_t<*maybe-const*>operator-(const *sentinel*& x, const *iterator*& y); };} [🔗](#lib:elements_view::sentinel,constructor) `constexpr explicit sentinel(sentinel_t end); ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L10717) *Effects*: Initializes *end_* with end[.](#1.sentence-1) [🔗](#lib:elements_view::sentinel,constructor_) `constexpr sentinel(sentinel other) requires Const && [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_­to [concept.convertible]"), sentinel_t>; ` [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L10729) *Effects*: Initializes *end_* with std​::​move(other.*end_*)[.](#2.sentence-1) [🔗](#lib:base,elements_view::sentinel) `constexpr sentinel_t base() const; ` [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L10740) *Effects*: Equivalent to: return *end_*; [🔗](#lib:operator==,elements_view::sentinel) `template requires [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]"), iterator_t>> friend constexpr bool operator==(const iterator& x, const sentinel& y); ` [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L10753) *Effects*: Equivalent to: return x.*current_* == y.*end_*; [🔗](#lib:operator-,elements_view::sentinel) `template requires [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]"), iterator_t>> friend constexpr range_difference_t> operator-(const iterator& x, const sentinel& y); ` [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L10767) *Effects*: Equivalent to: return x.*current_* - y.*end_*; [🔗](#lib:operator-,elements_view::sentinel_) `template requires [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]"), iterator_t>> friend constexpr range_difference_t> operator-(const sentinel& x, const iterator& y); ` [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L10781) *Effects*: Equivalent to: return x.*end_* - y.*current_*;