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

557 lines
21 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.

[reverse.iterators]
# 24 Iterators library [[iterators]](./#iterators)
## 24.5 Iterator adaptors [[predef.iterators]](predef.iterators#reverse.iterators)
### 24.5.1 Reverse iterators [reverse.iterators]
#### [24.5.1.1](#general) General [[reverse.iterators.general]](reverse.iterators.general)
[1](#general-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3185)
Class template reverse_iterator is an iterator adaptor that iterates from the end of the sequence defined by its underlying iterator to the beginning of that sequence[.](#general-1.sentence-1)
#### [24.5.1.2](#reverse.iterator) Class template reverse_iterator [[reverse.iterator]](reverse.iterator)
[🔗](#lib:reverse_iterator)
namespace std {template<class Iterator>class reverse_iterator {public:using iterator_type = Iterator; using iterator_concept = *see below*; using iterator_category = *see below*; using value_type = iter_value_t<Iterator>; using difference_type = iter_difference_t<Iterator>; using pointer = typename iterator_traits<Iterator>::pointer; using reference = iter_reference_t<Iterator>; constexpr reverse_iterator(); constexpr explicit reverse_iterator(Iterator x); template<class U> constexpr reverse_iterator(const reverse_iterator<U>& u); template<class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u); constexpr Iterator base() const; constexpr reference operator*() const; constexpr pointer operator->() const requires *see below*; constexpr reverse_iterator& operator++(); constexpr reverse_iterator operator++(int); constexpr reverse_iterator& operator--(); constexpr reverse_iterator operator--(int); constexpr reverse_iterator operator+ (difference_type n) const; constexpr reverse_iterator& operator+=(difference_type n); constexpr reverse_iterator operator- (difference_type n) const; constexpr reverse_iterator& operator-=(difference_type n); constexpr *unspecified* operator[](difference_type n) const; friend constexpr iter_rvalue_reference_t<Iterator> iter_move(const reverse_iterator& i) noexcept(*see below*); template<[indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4Concept indirectly_­swappable[alg.req.ind.swap]")<Iterator> Iterator2>friend constexpr void iter_swap(const reverse_iterator& x, const reverse_iterator<Iterator2>& y) noexcept(*see below*); protected: Iterator current; };}
[1](#reverse.iterator-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3237)
The member [*typedef-name*](dcl.typedef#nt:typedef-name "9.2.4The typedef specifier[dcl.typedef]") iterator_concept denotes
- [(1.1)](#reverse.iterator-1.1)
random_access_iterator_tag if Iterator models[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13Concept random_­access_­iterator[iterator.concept.random.access]"), and
- [(1.2)](#reverse.iterator-1.2)
bidirectional_iterator_tag otherwise[.](#reverse.iterator-1.sentence-1)
[2](#reverse.iterator-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3247)
The member [*typedef-name*](dcl.typedef#nt:typedef-name "9.2.4The typedef specifier[dcl.typedef]") iterator_category denotes
- [(2.1)](#reverse.iterator-2.1)
random_access_iterator_tag if
the typeiterator_traits<Iterator>::iterator_category models[derived_from](concept.derived#concept:derived_from "18.4.3Concept derived_­from[concept.derived]")<random_access_iterator_tag>, and
- [(2.2)](#reverse.iterator-2.2)
iterator_traits<Iterator>::iterator_category otherwise[.](#reverse.iterator-2.sentence-1)
#### [24.5.1.3](#reverse.iter.requirements) Requirements [[reverse.iter.requirements]](reverse.iter.requirements)
[1](#reverse.iter.requirements-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3261)
The template parameterIterator shall either meet the requirements of a*Cpp17BidirectionalIterator* ([[bidirectional.iterators]](bidirectional.iterators "24.3.5.6Bidirectional iterators"))
or model[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12Concept bidirectional_­iterator[iterator.concept.bidir]") ([[iterator.concept.bidir]](iterator.concept.bidir "24.3.4.12Concept bidirectional_­iterator"))[.](#reverse.iter.requirements-1.sentence-1)
[2](#reverse.iter.requirements-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3269)
Additionally,Iterator shall either meet the requirements of a*Cpp17RandomAccessIterator* ([[random.access.iterators]](random.access.iterators "24.3.5.7Random access iterators"))
or model[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13Concept random_­access_­iterator[iterator.concept.random.access]") ([[iterator.concept.random.access]](iterator.concept.random.access "24.3.4.13Concept random_­access_­iterator"))
if the definitions of any of the members
- [(2.1)](#reverse.iter.requirements-2.1)
operator+,operator-,operator+=,operator-= ([[reverse.iter.nav]](#reverse.iter.nav "24.5.1.7Navigation")), or
- [(2.2)](#reverse.iter.requirements-2.2)
operator[] ([[reverse.iter.elem]](#reverse.iter.elem "24.5.1.6Element access")),
or the non-member operators ([[reverse.iter.cmp]](#reverse.iter.cmp "24.5.1.8Comparisons"))
- [(2.3)](#reverse.iter.requirements-2.3)
operator<,operator>,operator<=,operator>=,operator-,
oroperator+ ([[reverse.iter.nonmember]](#reverse.iter.nonmember "24.5.1.9Non-member functions"))
are instantiated ([[temp.inst]](temp.inst "13.9.2Implicit instantiation"))[.](#reverse.iter.requirements-2.sentence-1)
#### [24.5.1.4](#reverse.iter.cons) Construction and assignment [[reverse.iter.cons]](reverse.iter.cons)
[🔗](#lib:reverse_iterator,constructor)
`constexpr reverse_iterator();
`
[1](#reverse.iter.cons-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3307)
*Effects*: Value-initializescurrent[.](#reverse.iter.cons-1.sentence-1)
[🔗](#lib:reverse_iterator,constructor_)
`constexpr explicit reverse_iterator(Iterator x);
`
[2](#reverse.iter.cons-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3319)
*Effects*: Initializescurrent with x[.](#reverse.iter.cons-2.sentence-1)
[🔗](#lib:reverse_iterator,constructor__)
`template<class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
`
[3](#reverse.iter.cons-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3332)
*Constraints*: is_same_v<U, Iterator> is false andconst U& models [convertible_to](concept.convertible#concept:convertible_to "18.4.4Concept convertible_­to[concept.convertible]")<Iterator>[.](#reverse.iter.cons-3.sentence-1)
[4](#reverse.iter.cons-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3337)
*Effects*: Initializescurrent withu.current[.](#reverse.iter.cons-4.sentence-1)
[🔗](#lib:operator=,reverse_iterator)
`template<class U>
constexpr reverse_iterator&
operator=(const reverse_iterator<U>& u);
`
[5](#reverse.iter.cons-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3353)
*Constraints*: is_same_v<U, Iterator> is false,const U& models [convertible_to](concept.convertible#concept:convertible_to "18.4.4Concept convertible_­to[concept.convertible]")<Iterator>, and[assignable_from](concept.assignable#concept:assignable_from "18.4.8Concept assignable_­from[concept.assignable]")<Iterator&, const U&> is modeled[.](#reverse.iter.cons-5.sentence-1)
[6](#reverse.iter.cons-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3359)
*Effects*: Assigns u.current to current[.](#reverse.iter.cons-6.sentence-1)
[7](#reverse.iter.cons-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3363)
*Returns*: *this[.](#reverse.iter.cons-7.sentence-1)
#### [24.5.1.5](#reverse.iter.conv) Conversion [[reverse.iter.conv]](reverse.iter.conv)
[🔗](#lib:base,reverse_iterator)
`constexpr Iterator base() const;
`
[1](#reverse.iter.conv-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3376)
*Returns*: current[.](#reverse.iter.conv-1.sentence-1)
#### [24.5.1.6](#reverse.iter.elem) Element access [[reverse.iter.elem]](reverse.iter.elem)
[🔗](#lib:operator*,reverse_iterator)
`constexpr reference operator*() const;
`
[1](#reverse.iter.elem-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3389)
*Effects*: As if by:Iterator tmp = current;return *--tmp;
[🔗](#lib:operator-%3e,reverse_iterator)
`constexpr pointer operator->() const
requires (is_pointer_v<Iterator> ||
requires(const Iterator i) { i.operator->(); });
`
[2](#reverse.iter.elem-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3406)
*Effects*:
- [(2.1)](#reverse.iter.elem-2.1)
If Iterator is a pointer type, equivalent to:return prev(current);
- [(2.2)](#reverse.iter.elem-2.2)
Otherwise, equivalent to:return prev(current).operator->();
[🔗](#lib:operator%5b%5d,reverse_iterator)
`constexpr unspecified operator[](difference_type n) const;
`
[3](#reverse.iter.elem-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3423)
*Returns*: current[-n - 1][.](#reverse.iter.elem-3.sentence-1)
#### [24.5.1.7](#reverse.iter.nav) Navigation [[reverse.iter.nav]](reverse.iter.nav)
[🔗](#lib:operator+,reverse_iterator)
`constexpr reverse_iterator operator+(difference_type n) const;
`
[1](#reverse.iter.nav-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3436)
*Returns*: reverse_iterator(current - n)[.](#reverse.iter.nav-1.sentence-1)
[🔗](#lib:operator-,reverse_iterator)
`constexpr reverse_iterator operator-(difference_type n) const;
`
[2](#reverse.iter.nav-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3447)
*Returns*: reverse_iterator(current + n)[.](#reverse.iter.nav-2.sentence-1)
[🔗](#lib:operator++,reverse_iterator)
`constexpr reverse_iterator& operator++();
`
[3](#reverse.iter.nav-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3458)
*Effects*: As if by: --current;
[4](#reverse.iter.nav-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3462)
*Returns*: *this[.](#reverse.iter.nav-4.sentence-1)
[🔗](#lib:operator++,reverse_iterator_)
`constexpr reverse_iterator operator++(int);
`
[5](#reverse.iter.nav-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3473)
*Effects*: As if by:reverse_iterator tmp = *this;--current;return tmp;
[🔗](#lib:operator--,reverse_iterator)
`constexpr reverse_iterator& operator--();
`
[6](#reverse.iter.nav-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3489)
*Effects*: As if by ++current[.](#reverse.iter.nav-6.sentence-1)
[7](#reverse.iter.nav-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3493)
*Returns*: *this[.](#reverse.iter.nav-7.sentence-1)
[🔗](#lib:operator--,reverse_iterator_)
`constexpr reverse_iterator operator--(int);
`
[8](#reverse.iter.nav-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3504)
*Effects*: As if by:reverse_iterator tmp = *this;++current;return tmp;
[🔗](#lib:operator+=,reverse_iterator)
`constexpr reverse_iterator& operator+=(difference_type n);
`
[9](#reverse.iter.nav-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3520)
*Effects*: As if by: current -= n;
[10](#reverse.iter.nav-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3524)
*Returns*: *this[.](#reverse.iter.nav-10.sentence-1)
[🔗](#lib:operator-=,reverse_iterator)
`constexpr reverse_iterator& operator-=(difference_type n);
`
[11](#reverse.iter.nav-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3535)
*Effects*: As if by: current += n;
[12](#reverse.iter.nav-12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3539)
*Returns*: *this[.](#reverse.iter.nav-12.sentence-1)
#### [24.5.1.8](#reverse.iter.cmp) Comparisons [[reverse.iter.cmp]](reverse.iter.cmp)
[🔗](#lib:operator==,reverse_iterator)
`template<class Iterator1, class Iterator2>
constexpr bool operator==(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
`
[1](#reverse.iter.cmp-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3555)
*Constraints*: x.base() == y.base() is well-formed and
convertible to bool[.](#reverse.iter.cmp-1.sentence-1)
[2](#reverse.iter.cmp-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3560)
*Returns*: x.base() == y.base()[.](#reverse.iter.cmp-2.sentence-1)
[🔗](#lib:operator!=,reverse_iterator)
`template<class Iterator1, class Iterator2>
constexpr bool operator!=(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
`
[3](#reverse.iter.cmp-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3574)
*Constraints*: x.base() != y.base() is well-formed and
convertible to bool[.](#reverse.iter.cmp-3.sentence-1)
[4](#reverse.iter.cmp-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3579)
*Returns*: x.base() != y.base()[.](#reverse.iter.cmp-4.sentence-1)
[🔗](#lib:operator%3c,reverse_iterator)
`template<class Iterator1, class Iterator2>
constexpr bool operator<(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
`
[5](#reverse.iter.cmp-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3593)
*Constraints*: x.base() > y.base() is well-formed and
convertible to bool[.](#reverse.iter.cmp-5.sentence-1)
[6](#reverse.iter.cmp-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3598)
*Returns*: x.base() > y.base()[.](#reverse.iter.cmp-6.sentence-1)
[🔗](#lib:operator%3e,reverse_iterator)
`template<class Iterator1, class Iterator2>
constexpr bool operator>(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
`
[7](#reverse.iter.cmp-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3612)
*Constraints*: x.base() < y.base() is well-formed and
convertible to bool[.](#reverse.iter.cmp-7.sentence-1)
[8](#reverse.iter.cmp-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3617)
*Returns*: x.base() < y.base()[.](#reverse.iter.cmp-8.sentence-1)
[🔗](#lib:operator%3c=,reverse_iterator)
`template<class Iterator1, class Iterator2>
constexpr bool operator<=(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
`
[9](#reverse.iter.cmp-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3631)
*Constraints*: x.base() >= y.base() is well-formed and
convertible to bool[.](#reverse.iter.cmp-9.sentence-1)
[10](#reverse.iter.cmp-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3636)
*Returns*: x.base() >= y.base()[.](#reverse.iter.cmp-10.sentence-1)
[🔗](#lib:operator%3e=,reverse_iterator)
`template<class Iterator1, class Iterator2>
constexpr bool operator>=(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
`
[11](#reverse.iter.cmp-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3650)
*Constraints*: x.base() <= y.base() is well-formed and
convertible to bool[.](#reverse.iter.cmp-11.sentence-1)
[12](#reverse.iter.cmp-12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3655)
*Returns*: x.base() <= y.base()[.](#reverse.iter.cmp-12.sentence-1)
[🔗](#lib:operator%3c=%3e,reverse_iterator)
`template<class Iterator1, [three_way_comparable_with](cmp.concept#concept:three_way_comparable_with "17.12.4Concept three_­way_­comparable[cmp.concept]")<Iterator1> Iterator2>
constexpr compare_three_way_result_t<Iterator1, Iterator2>
operator<=>(const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y);
`
[13](#reverse.iter.cmp-13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3669)
*Returns*: y.base() <=> x.base()[.](#reverse.iter.cmp-13.sentence-1)
[14](#reverse.iter.cmp-14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3673)
[*Note [1](#reverse.iter.cmp-note-1)*:
The argument order in the *Returns*: element is reversed
because this is a reverse iterator[.](#reverse.iter.cmp-14.sentence-1)
— *end note*]
#### [24.5.1.9](#reverse.iter.nonmember) Non-member functions [[reverse.iter.nonmember]](reverse.iter.nonmember)
[🔗](#lib:operator-,reverse_iterator_)
`template<class Iterator1, class Iterator2>
constexpr auto operator-(
const reverse_iterator<Iterator1>& x,
const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
`
[1](#reverse.iter.nonmember-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3691)
*Returns*: y.base() - x.base()[.](#reverse.iter.nonmember-1.sentence-1)
[🔗](#lib:operator+,reverse_iterator_)
`template<class Iterator>
constexpr reverse_iterator<Iterator> operator+(
iter_difference_t<Iterator> n,
const reverse_iterator<Iterator>& x);
`
[2](#reverse.iter.nonmember-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3705)
*Returns*: reverse_iterator<Iterator>(x.base() - n)[.](#reverse.iter.nonmember-2.sentence-1)
[🔗](#lib:iter_move,reverse_iterator)
`friend constexpr iter_rvalue_reference_t<Iterator>
iter_move(const reverse_iterator& i) noexcept(see below);
`
[3](#reverse.iter.nonmember-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3717)
*Effects*: Equivalent to:auto tmp = i.base();return ranges::iter_move(--tmp);
[4](#reverse.iter.nonmember-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3725)
*Remarks*: The exception specification is equivalent to:is_nothrow_copy_constructible_v<Iterator> &&noexcept(ranges::iter_move(--declval<Iterator&>()))
[🔗](#lib:iter_swap,reverse_iterator)
`template<[indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4Concept indirectly_­swappable[alg.req.ind.swap]")<Iterator> Iterator2>
friend constexpr void
iter_swap(const reverse_iterator& x,
const reverse_iterator<Iterator2>& y) noexcept(see below);
`
[5](#reverse.iter.nonmember-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3743)
*Effects*: Equivalent to:auto xtmp = x.base();auto ytmp = y.base();
ranges::iter_swap(--xtmp, --ytmp);
[6](#reverse.iter.nonmember-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3752)
*Remarks*: The exception specification is equivalent to:is_nothrow_copy_constructible_v<Iterator> && is_nothrow_copy_constructible_v<Iterator2> &&noexcept(ranges::iter_swap(--declval<Iterator&>(), --declval<Iterator2&>()))
[🔗](#lib:reverse_iterator,make_reverse_iterator_non-member_function)
`template<class Iterator>
constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
`
[7](#reverse.iter.nonmember-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L3770)
*Returns*: reverse_iterator<Iterator>(i)[.](#reverse.iter.nonmember-7.sentence-1)