[range.repeat] # 25 Ranges library [[ranges]](./#ranges) ## 25.6 Range factories [[range.factories]](range.factories#range.repeat) ### 25.6.5 Repeat view [range.repeat] #### [25.6.5.1](#overview) Overview [[range.repeat.overview]](range.repeat.overview) [1](#overview-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3559) repeat_view generates a sequence of elements by repeatedly producing the same value[.](#overview-1.sentence-1) [2](#overview-2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3563) The name views​::​repeat denotes a customization point object ([[customization.point.object]](customization.point.object "16.3.3.3.5 Customization Point Object types"))[.](#overview-2.sentence-1) Given subexpressions E and F, the expressions views​::​repeat(E) and views​::​repeat(E, F) are expression-equivalent torepeat_view>(E) and repeat_view(E, F), respectively[.](#overview-2.sentence-2) [3](#overview-3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3572) [*Example [1](#overview-example-1)*: for (int i : views::repeat(17, 4)) cout << i << ' ';// prints 17 17 17 17 — *end example*] #### [25.6.5.2](#view) Class template repeat_view [[range.repeat.view]](range.repeat.view) namespace std::ranges {templateconcept [*integer-like-with-usable-difference-type*](#concept:integer-like-with-usable-difference-type "25.6.5.2 Class template repeat_­view [range.repeat.view]") = // *exposition only**is-signed-integer-like* || (*is-integer-like* && [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_­incrementable [iterator.concept.winc]")); template<[move_constructible](concept.moveconstructible#concept:move_constructible "18.4.13 Concept move_­constructible [concept.moveconstructible]") T, [semiregular](concepts.object#concept:semiregular "18.6 Object concepts [concepts.object]") Bound = unreachable_sentinel_t>requires (is_object_v && [same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")> &&([*integer-like-with-usable-difference-type*](#concept:integer-like-with-usable-difference-type "25.6.5.2 Class template repeat_­view [range.repeat.view]") ||[same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")))class [repeat_view](#lib:repeat_view "25.6.5.2 Class template repeat_­view [range.repeat.view]") : public view_interface> {private:// [[range.repeat.iterator]](#iterator "25.6.5.3 Class repeat_­view​::​iterator"), class repeat_view​::​*iterator*struct *iterator*; // *exposition only**movable-box* *value_*; // *exposition only*, see [[range.move.wrap]](range.move.wrap "25.7.3 Movable wrapper") Bound *bound_* = Bound(); // *exposition only*public: repeat_view() requires [default_initializable](concept.default.init#concept:default_initializable "18.4.12 Concept default_­initializable [concept.default.init]") = default; constexpr explicit repeat_view(const T& value, Bound bound = Bound())requires [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_­constructible [concept.copyconstructible]"); constexpr explicit repeat_view(T&& value, Bound bound = Bound()); templaterequires [constructible_from](concept.constructible#concept:constructible_from "18.4.11 Concept constructible_­from [concept.constructible]") &&[constructible_from](concept.constructible#concept:constructible_from "18.4.11 Concept constructible_­from [concept.constructible]")constexpr explicit repeat_view(piecewise_construct_t, tuple value_args, tuple bound_args = tuple<>{}); constexpr *iterator* begin() const; constexpr *iterator* end() const requires (![same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")); constexpr unreachable_sentinel_t end() const noexcept; constexpr auto size() const requires (![same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")); }; template repeat_view(T, Bound = Bound()) -> repeat_view;} [🔗](#lib:repeat_view,constructor) `constexpr explicit repeat_view(const T& value, Bound bound = Bound()) requires [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_­constructible [concept.copyconstructible]"); ` [1](#view-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3632) *Preconditions*: If Bound is not unreachable_sentinel_t,bound ≥ 0[.](#view-1.sentence-1) [2](#view-2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3637) *Effects*: Initializes *value_* with value and*bound_* with bound[.](#view-2.sentence-1) [🔗](#lib:repeat_view,constructor_) `constexpr explicit repeat_view(T&& value, Bound bound = Bound()); ` [3](#view-3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3649) *Preconditions*: If Bound is not unreachable_sentinel_t, bound ≥ 0[.](#view-3.sentence-1) [4](#view-4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3653) *Effects*: Initializes *value_* with std​::​move(value) and*bound_* with bound[.](#view-4.sentence-1) [🔗](#lib:repeat_view,constructor__) `template requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11 Concept constructible_­from [concept.constructible]") && [constructible_from](concept.constructible#concept:constructible_from "18.4.11 Concept constructible_­from [concept.constructible]") constexpr explicit repeat_view(piecewise_construct_t, tuple value_args, tuple bound_args = tuple<>{}); ` [5](#view-5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3669) *Effects*: Initializes *value_* withmake_from_tuple(std​::​move(value_args)) and initializes *bound_* withmake_from_tuple(std​::​move(bound_args))[.](#view-5.sentence-1) The behavior is undefined ifBound is not unreachable_sentinel_t and*bound_* is negative[.](#view-5.sentence-2) [🔗](#lib:begin,repeat_view) `constexpr iterator begin() const; ` [6](#view-6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3687) *Effects*: Equivalent to: return *iterator*(addressof(**value_*)); [🔗](#lib:end,repeat_view) `constexpr iterator end() const requires (![same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")); ` [7](#view-7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3698) *Effects*: Equivalent to: return *iterator*(addressof(**value_*), *bound_*); [🔗](#lib:end,repeat_view_) `constexpr unreachable_sentinel_t end() const noexcept; ` [8](#view-8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3709) *Effects*: Equivalent to: return unreachable_sentinel; [🔗](#lib:size,repeat_view) `constexpr auto size() const requires (![same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")); ` [9](#view-9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3720) *Effects*: Equivalent to: return *to-unsigned-like*(*bound_*); #### [25.6.5.3](#iterator) Class repeat_view​::​*iterator* [[range.repeat.iterator]](range.repeat.iterator) [🔗](#lib:repeat_view::iterator) namespace std::ranges {template<[move_constructible](concept.moveconstructible#concept:move_constructible "18.4.13 Concept move_­constructible [concept.moveconstructible]") T, [semiregular](concepts.object#concept:semiregular "18.6 Object concepts [concepts.object]") Bound>requires (is_object_v && [same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")> &&([*integer-like-with-usable-difference-type*](#concept:integer-like-with-usable-difference-type "25.6.5.2 Class template repeat_­view [range.repeat.view]") ||[same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")))class repeat_view::*iterator* {private:using *index-type* = // *exposition only* conditional_t<[same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]"), ptrdiff_t, Bound>; const T* *value_* = nullptr; // *exposition only**index-type* *current_* = *index-type*(); // *exposition only*constexpr explicit *iterator*(const T* value, *index-type* b = *index-type*()); // *exposition only*public:using iterator_concept = random_access_iterator_tag; using iterator_category = random_access_iterator_tag; using value_type = T; using difference_type = *see below*; *iterator*() = default; constexpr const T& operator*() const noexcept; constexpr *iterator*& operator++(); constexpr *iterator* operator++(int); constexpr *iterator*& operator--(); constexpr *iterator* operator--(int); constexpr *iterator*& operator+=(difference_type n); constexpr *iterator*& operator-=(difference_type n); constexpr const T& operator[](difference_type n) const noexcept; friend constexpr bool operator==(const *iterator*& x, const *iterator*& y); friend constexpr auto operator<=>(const *iterator*& x, const *iterator*& y); friend constexpr *iterator* operator+(*iterator* i, difference_type n); friend constexpr *iterator* operator+(difference_type n, *iterator* i); friend constexpr *iterator* operator-(*iterator* i, difference_type n); friend constexpr difference_type operator-(const *iterator*& x, const *iterator*& y); };} [1](#iterator-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3775) If *is-signed-integer-like*<*index-type*> is true, the member [*typedef-name*](dcl.typedef#nt:typedef-name "9.2.4 The typedef specifier [dcl.typedef]") difference_type denotes *index-type*[.](#iterator-1.sentence-1) Otherwise, it denotes *IOTA-DIFF-T*(*index-type*) ([[range.iota.view]](range.iota.view "25.6.4.2 Class template iota_­view"))[.](#iterator-1.sentence-2) [🔗](#lib:repeat_view::iterator,constructor) `constexpr explicit iterator(const T* value, index-type b = index-type()); ` [2](#iterator-2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3787) *Preconditions*: If Bound is not unreachable_sentinel_t, b ≥ 0[.](#iterator-2.sentence-1) [3](#iterator-3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3791) *Effects*: Initializes *value_* with value and*current_* with b[.](#iterator-3.sentence-1) [🔗](#lib:operator*,repeat_view::iterator) `constexpr const T& operator*() const noexcept; ` [4](#iterator-4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3803) *Effects*: Equivalent to: return **value_*; [🔗](#lib:operator++,repeat_view::iterator) `constexpr iterator& operator++(); ` [5](#iterator-5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3814) *Effects*: Equivalent to:++*current_*;return *this; [🔗](#lib:operator++,repeat_view::iterator_) `constexpr iterator operator++(int); ` [6](#iterator-6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3829) *Effects*: Equivalent to:auto tmp = *this;++*this;return tmp; [🔗](#lib:operator--,repeat_view::iterator) `constexpr iterator& operator--(); ` [7](#iterator-7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3845) *Preconditions*: If Bound is not unreachable_sentinel_t,current_>0[.](#iterator-7.sentence-1) [8](#iterator-8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3850) *Effects*: Equivalent to:--*current_*;return *this; [🔗](#lib:operator--,repeat_view::iterator_) `constexpr iterator operator--(int); ` [9](#iterator-9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3865) *Effects*: Equivalent to:auto tmp = *this;--*this;return tmp; [🔗](#lib:operator+=,repeat_view::iterator) `constexpr iterator& operator+=(difference_type n); ` [10](#iterator-10) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3881) *Preconditions*: If Bound is not unreachable_sentinel_t,current_+n≥0[.](#iterator-10.sentence-1) [11](#iterator-11) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3886) *Effects*: Equivalent to:*current_* += n;return *this; [🔗](#lib:operator-=,repeat_view::iterator) `constexpr iterator& operator-=(difference_type n); ` [12](#iterator-12) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3901) *Preconditions*: If Bound is not unreachable_sentinel_t,current_−n≥0[.](#iterator-12.sentence-1) [13](#iterator-13) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3906) *Effects*: Equivalent to:*current_* -= n;return *this; [🔗](#lib:operator%5b%5d,repeat_view::iterator) `constexpr const T& operator[](difference_type n) const noexcept; ` [14](#iterator-14) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3921) *Effects*: Equivalent to: return *(*this + n); [🔗](#lib:operator==,repeat_view::iterator) `friend constexpr bool operator==(const iterator& x, const iterator& y); ` [15](#iterator-15) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3932) *Effects*: Equivalent to: return x.*current_* == y.*current_*; [🔗](#lib:operator%3c=%3e,repeat_view::iterator) `friend constexpr auto operator<=>(const iterator& x, const iterator& y); ` [16](#iterator-16) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3943) *Effects*: Equivalent to: return x.*current_* <=> y.*current_*; [🔗](#lib:operator+,repeat_view::iterator) `friend constexpr iterator operator+(iterator i, difference_type n); friend constexpr iterator operator+(difference_type n, iterator i); ` [17](#iterator-17) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3955) *Effects*: Equivalent to:i += n;return i; [🔗](#lib:operator-,repeat_view::iterator) `friend constexpr iterator operator-(iterator i, difference_type n); ` [18](#iterator-18) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3970) *Effects*: Equivalent to:i -= n;return i; [🔗](#lib:operator-,repeat_view::iterator_) `friend constexpr difference_type operator-(const iterator& x, const iterator& y); ` [19](#iterator-19) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L3985) *Effects*: Equivalent to:return static_cast(x.*current_*) - static_cast(y.*current_*);