From Jason Turner

[reverse.iterators]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmp1m5_t9m6/{from.md → to.md} +175 -140
tmp/tmp1m5_t9m6/{from.md → to.md} RENAMED
@@ -1,35 +1,34 @@
1
  ### Reverse iterators <a id="reverse.iterators">[[reverse.iterators]]</a>
2
 
3
  Class template `reverse_iterator` is an iterator adaptor that iterates
4
  from the end of the sequence defined by its underlying iterator to the
5
- beginning of that sequence. The fundamental relation between a reverse
6
- iterator and its corresponding iterator `i` is established by the
7
- identity: `&*(reverse_iterator(i)) == &*(i - 1)`.
8
 
9
  #### Class template `reverse_iterator` <a id="reverse.iterator">[[reverse.iterator]]</a>
10
 
11
  ``` cpp
12
  namespace std {
13
  template<class Iterator>
14
  class reverse_iterator {
15
  public:
16
  using iterator_type = Iterator;
17
- using iterator_category = typename iterator_traits<Iterator>::iterator_category;
18
- using value_type = typename iterator_traits<Iterator>::value_type;
19
- using difference_type = typename iterator_traits<Iterator>::difference_type;
 
20
  using pointer = typename iterator_traits<Iterator>::pointer;
21
- using reference = typename iterator_traits<Iterator>::reference;
22
 
23
  constexpr reverse_iterator();
24
  constexpr explicit reverse_iterator(Iterator x);
25
  template<class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
26
  template<class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);
27
 
28
- constexpr Iterator base() const; // explicit
29
  constexpr reference operator*() const;
30
- constexpr pointer operator->() const;
31
 
32
  constexpr reverse_iterator& operator++();
33
  constexpr reverse_iterator operator++(int);
34
  constexpr reverse_iterator& operator--();
35
  constexpr reverse_iterator operator--(int);
@@ -37,72 +36,60 @@ namespace std {
37
  constexpr reverse_iterator operator+ (difference_type n) const;
38
  constexpr reverse_iterator& operator+=(difference_type n);
39
  constexpr reverse_iterator operator- (difference_type n) const;
40
  constexpr reverse_iterator& operator-=(difference_type n);
41
  constexpr unspecified operator[](difference_type n) const;
 
 
 
 
 
 
 
 
42
  protected:
43
  Iterator current;
44
  };
45
-
46
- template <class Iterator1, class Iterator2>
47
- constexpr bool operator==(
48
- const reverse_iterator<Iterator1>& x,
49
- const reverse_iterator<Iterator2>& y);
50
- template <class Iterator1, class Iterator2>
51
- constexpr bool operator<(
52
- const reverse_iterator<Iterator1>& x,
53
- const reverse_iterator<Iterator2>& y);
54
- template <class Iterator1, class Iterator2>
55
- constexpr bool operator!=(
56
- const reverse_iterator<Iterator1>& x,
57
- const reverse_iterator<Iterator2>& y);
58
- template <class Iterator1, class Iterator2>
59
- constexpr bool operator>(
60
- const reverse_iterator<Iterator1>& x,
61
- const reverse_iterator<Iterator2>& y);
62
- template <class Iterator1, class Iterator2>
63
- constexpr bool operator>=(
64
- const reverse_iterator<Iterator1>& x,
65
- const reverse_iterator<Iterator2>& y);
66
- template <class Iterator1, class Iterator2>
67
- constexpr bool operator<=(
68
- const reverse_iterator<Iterator1>& x,
69
- const reverse_iterator<Iterator2>& y);
70
- template <class Iterator1, class Iterator2>
71
- constexpr auto operator-(
72
- const reverse_iterator<Iterator1>& x,
73
- const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
74
- template <class Iterator>
75
- constexpr reverse_iterator<Iterator> operator+(
76
- typename reverse_iterator<Iterator>::difference_type n,
77
- const reverse_iterator<Iterator>& x);
78
-
79
- template <class Iterator>
80
- constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
81
  }
82
  ```
83
 
84
- #### `reverse_iterator` requirements <a id="reverse.iter.requirements">[[reverse.iter.requirements]]</a>
85
-
86
- The template parameter `Iterator` shall meet all the requirements of a
87
- Bidirectional Iterator ([[bidirectional.iterators]]).
88
-
89
- Additionally, `Iterator` shall meet the requirements of a random access
90
- iterator ([[random.access.iterators]]) if any of the members
91
- `operator+` ([[reverse.iter.op+]]), `operator-` (
92
- [[reverse.iter.op-]]), `operator+=` ([[reverse.iter.op+=]]),
93
- `operator-=` ([[reverse.iter.op-=]]), `operator[]` (
94
- [[reverse.iter.opindex]]), or the non-member operators `operator<` (
95
- [[reverse.iter.op<]]), `operator>` ([[reverse.iter.op>]]),
96
- `operator<=` ([[reverse.iter.op<=]]), `operator>=` (
97
- [[reverse.iter.op>=]]), `operator-` ([[reverse.iter.opdiff]]) or
98
- `operator+` ([[reverse.iter.opsum]]) are referenced in a way that
99
- requires instantiation ([[temp.inst]]).
100
-
101
- #### `reverse_iterator` operations <a id="reverse.iter.ops">[[reverse.iter.ops]]</a>
102
-
103
- ##### `reverse_iterator` constructor <a id="reverse.iter.cons">[[reverse.iter.cons]]</a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
  ``` cpp
106
  constexpr reverse_iterator();
107
  ```
108
 
@@ -121,31 +108,29 @@ constexpr explicit reverse_iterator(Iterator x);
121
  template<class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
122
  ```
123
 
124
  *Effects:* Initializes `current` with `u.current`.
125
 
126
- ##### `reverse_iterator::operator=` <a id="reverse.iter.op=">[[reverse.iter.op=]]</a>
127
-
128
  ``` cpp
129
  template<class U>
130
  constexpr reverse_iterator&
131
  operator=(const reverse_iterator<U>& u);
132
  ```
133
 
134
- *Effects:* Assigns `u.base()` to current.
135
 
136
  *Returns:* `*this`.
137
 
138
- ##### Conversion <a id="reverse.iter.conv">[[reverse.iter.conv]]</a>
139
 
140
  ``` cpp
141
  constexpr Iterator base() const; // explicit
142
  ```
143
 
144
  *Returns:* `current`.
145
 
146
- ##### `operator*` <a id="reverse.iter.op.star">[[reverse.iter.op.star]]</a>
147
 
148
  ``` cpp
149
  constexpr reference operator*() const;
150
  ```
151
 
@@ -154,19 +139,41 @@ constexpr reference operator*() const;
154
  ``` cpp
155
  Iterator tmp = current;
156
  return *--tmp;
157
  ```
158
 
159
- ##### `operator->` <a id="reverse.iter.opref">[[reverse.iter.opref]]</a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
 
161
  ``` cpp
162
- constexpr pointer operator->() const;
163
  ```
164
 
165
- *Returns:* `addressof(operator*())`.
 
 
 
 
166
 
167
- ##### `operator++` <a id="reverse.iter.op++">[[reverse.iter.op++]]</a>
168
 
169
  ``` cpp
170
  constexpr reverse_iterator& operator++();
171
  ```
172
 
@@ -184,12 +191,10 @@ constexpr reverse_iterator operator++(int);
184
  reverse_iterator tmp = *this;
185
  --current;
186
  return tmp;
187
  ```
188
 
189
- \[reverse.iter.op\]`operator\dcr`
190
-
191
  ``` cpp
192
  constexpr reverse_iterator& operator--();
193
  ```
194
 
195
  *Effects:* As if by `++current`.
@@ -206,143 +211,173 @@ constexpr reverse_iterator operator--(int);
206
  reverse_iterator tmp = *this;
207
  ++current;
208
  return tmp;
209
  ```
210
 
211
- ##### `operator+` <a id="reverse.iter.op+">[[reverse.iter.op+]]</a>
212
-
213
- ``` cpp
214
- constexpr reverse_iterator operator+(difference_type n) const;
215
- ```
216
-
217
- *Returns:* `reverse_iterator(current-n)`.
218
-
219
- ##### `operator+=` <a id="reverse.iter.op+=">[[reverse.iter.op+=]]</a>
220
-
221
  ``` cpp
222
  constexpr reverse_iterator& operator+=(difference_type n);
223
  ```
224
 
225
  *Effects:* As if by: `current -= n;`
226
 
227
  *Returns:* `*this`.
228
 
229
- ##### `operator-` <a id="reverse.iter.op-">[[reverse.iter.op-]]</a>
230
-
231
- ``` cpp
232
- constexpr reverse_iterator operator-(difference_type n) const;
233
- ```
234
-
235
- *Returns:* `reverse_iterator(current+n)`.
236
-
237
- ##### `operator-=` <a id="reverse.iter.op-=">[[reverse.iter.op-=]]</a>
238
-
239
  ``` cpp
240
  constexpr reverse_iterator& operator-=(difference_type n);
241
  ```
242
 
243
  *Effects:* As if by: `current += n;`
244
 
245
  *Returns:* `*this`.
246
 
247
- ##### `operator[]` <a id="reverse.iter.opindex">[[reverse.iter.opindex]]</a>
248
-
249
- ``` cpp
250
- constexpr unspecified operator[](difference_type n) const;
251
- ```
252
-
253
- *Returns:* `current[-n-1]`.
254
-
255
- ##### `operator==` <a id="reverse.iter.op==">[[reverse.iter.op==]]</a>
256
 
257
  ``` cpp
258
  template<class Iterator1, class Iterator2>
259
  constexpr bool operator==(
260
  const reverse_iterator<Iterator1>& x,
261
  const reverse_iterator<Iterator2>& y);
262
  ```
263
 
264
- *Returns:* `x.current == y.current`.
 
265
 
266
- ##### `operator<` <a id="reverse.iter.op<">[[reverse.iter.op<]]</a>
267
-
268
- ``` cpp
269
- template <class Iterator1, class Iterator2>
270
- constexpr bool operator<(
271
- const reverse_iterator<Iterator1>& x,
272
- const reverse_iterator<Iterator2>& y);
273
- ```
274
-
275
- *Returns:* `x.current > y.current`.
276
-
277
- ##### `operator!=` <a id="reverse.iter.op!=">[[reverse.iter.op!=]]</a>
278
 
279
  ``` cpp
280
  template<class Iterator1, class Iterator2>
281
  constexpr bool operator!=(
282
  const reverse_iterator<Iterator1>& x,
283
  const reverse_iterator<Iterator2>& y);
284
  ```
285
 
286
- *Returns:* `x.current != y.current`.
 
287
 
288
- ##### `operator>` <a id="reverse.iter.op>">[[reverse.iter.op>]]</a>
 
 
 
 
 
 
 
 
 
 
 
 
289
 
290
  ``` cpp
291
  template<class Iterator1, class Iterator2>
292
  constexpr bool operator>(
293
  const reverse_iterator<Iterator1>& x,
294
  const reverse_iterator<Iterator2>& y);
295
  ```
296
 
297
- *Returns:* `x.current < y.current`.
 
298
 
299
- ##### `operator>=` <a id="reverse.iter.op>=">[[reverse.iter.op>=]]</a>
300
-
301
- ``` cpp
302
- template <class Iterator1, class Iterator2>
303
- constexpr bool operator>=(
304
- const reverse_iterator<Iterator1>& x,
305
- const reverse_iterator<Iterator2>& y);
306
- ```
307
-
308
- *Returns:* `x.current <= y.current`.
309
-
310
- ##### `operator<=` <a id="reverse.iter.op<=">[[reverse.iter.op<=]]</a>
311
 
312
  ``` cpp
313
  template<class Iterator1, class Iterator2>
314
  constexpr bool operator<=(
315
  const reverse_iterator<Iterator1>& x,
316
  const reverse_iterator<Iterator2>& y);
317
  ```
318
 
319
- *Returns:* `x.current >= y.current`.
 
320
 
321
- ##### `operator-` <a id="reverse.iter.opdiff">[[reverse.iter.opdiff]]</a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
322
 
323
  ``` cpp
324
  template<class Iterator1, class Iterator2>
325
  constexpr auto operator-(
326
  const reverse_iterator<Iterator1>& x,
327
  const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
328
  ```
329
 
330
- *Returns:* `y.current - x.current`.
331
-
332
- ##### `operator+` <a id="reverse.iter.opsum">[[reverse.iter.opsum]]</a>
333
 
334
  ``` cpp
335
  template<class Iterator>
336
  constexpr reverse_iterator<Iterator> operator+(
337
  typename reverse_iterator<Iterator>::difference_type n,
338
  const reverse_iterator<Iterator>& x);
339
  ```
340
 
341
- *Returns:* `reverse_iterator<Iterator> (x.current - n)`.
342
 
343
- ##### Non-member function `make_reverse_iterator()` <a id="reverse.iter.make">[[reverse.iter.make]]</a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
344
 
345
  ``` cpp
346
  template<class Iterator>
347
  constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
348
  ```
 
1
  ### Reverse iterators <a id="reverse.iterators">[[reverse.iterators]]</a>
2
 
3
  Class template `reverse_iterator` is an iterator adaptor that iterates
4
  from the end of the sequence defined by its underlying iterator to the
5
+ beginning of that sequence.
 
 
6
 
7
  #### Class template `reverse_iterator` <a id="reverse.iterator">[[reverse.iterator]]</a>
8
 
9
  ``` cpp
10
  namespace std {
11
  template<class Iterator>
12
  class reverse_iterator {
13
  public:
14
  using iterator_type = Iterator;
15
+ using iterator_concept = see below;
16
+ using iterator_category = see below;
17
+ using value_type = iter_value_t<Iterator>;
18
+ using difference_type = iter_difference_t<Iterator>;
19
  using pointer = typename iterator_traits<Iterator>::pointer;
20
+ using reference = iter_reference_t<Iterator>;
21
 
22
  constexpr reverse_iterator();
23
  constexpr explicit reverse_iterator(Iterator x);
24
  template<class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
25
  template<class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);
26
 
27
+ constexpr Iterator base() const;
28
  constexpr reference operator*() const;
29
+ constexpr pointer operator->() const requires see below;
30
 
31
  constexpr reverse_iterator& operator++();
32
  constexpr reverse_iterator operator++(int);
33
  constexpr reverse_iterator& operator--();
34
  constexpr reverse_iterator operator--(int);
 
36
  constexpr reverse_iterator operator+ (difference_type n) const;
37
  constexpr reverse_iterator& operator+=(difference_type n);
38
  constexpr reverse_iterator operator- (difference_type n) const;
39
  constexpr reverse_iterator& operator-=(difference_type n);
40
  constexpr unspecified operator[](difference_type n) const;
41
+
42
+ friend constexpr iter_rvalue_reference_t<Iterator>
43
+ iter_move(const reverse_iterator& i) noexcept(see below);
44
+ template<indirectly_swappable<Iterator> Iterator2>
45
+ friend constexpr void
46
+ iter_swap(const reverse_iterator& x,
47
+ const reverse_iterator<Iterator2>& y) noexcept(see below);
48
+
49
  protected:
50
  Iterator current;
51
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  }
53
  ```
54
 
55
+ The member *typedef-name* `iterator_concept` denotes
56
+
57
+ - `random_access_iterator_tag` if `Iterator` models
58
+ `random_access_iterator`, and
59
+ - `bidirectional_iterator_tag` otherwise.
60
+
61
+ The member *typedef-name* `iterator_category` denotes
62
+
63
+ - `random_access_iterator_tag` if the type
64
+ `iterator_traits<{}Iterator>::iterator_category` models
65
+ `derived_from<random_access_iterator_tag>`, and
66
+ - `iterator_traits<{}Iterator>::iterator_category` otherwise.
67
+
68
+ #### Requirements <a id="reverse.iter.requirements">[[reverse.iter.requirements]]</a>
69
+
70
+ The template parameter `Iterator` shall either meet the requirements of
71
+ a *Cpp17BidirectionalIterator* [[bidirectional.iterators]] or model
72
+ `bidirectional_iterator` [[iterator.concept.bidir]].
73
+
74
+ Additionally, `Iterator` shall either meet the requirements of a
75
+ *Cpp17RandomAccessIterator* [[random.access.iterators]] or model
76
+ `random_access_iterator` [[iterator.concept.random.access]] if the
77
+ definitions of any of the members
78
+
79
+ - `operator+`, `operator-`, `operator+=`, `operator-=`
80
+ [[reverse.iter.nav]], or
81
+ - `operator[]` [[reverse.iter.elem]],
82
+
83
+ or the non-member operators [[reverse.iter.cmp]]
84
+
85
+ - `operator<`, `operator>`, `operator<=`, `operator>=`, `operator-`, or
86
+ `operator+` [[reverse.iter.nonmember]]
87
+
88
+ are instantiated [[temp.inst]].
89
+
90
+ #### Construction and assignment <a id="reverse.iter.cons">[[reverse.iter.cons]]</a>
91
 
92
  ``` cpp
93
  constexpr reverse_iterator();
94
  ```
95
 
 
108
  template<class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
109
  ```
110
 
111
  *Effects:* Initializes `current` with `u.current`.
112
 
 
 
113
  ``` cpp
114
  template<class U>
115
  constexpr reverse_iterator&
116
  operator=(const reverse_iterator<U>& u);
117
  ```
118
 
119
+ *Effects:* Assigns `u.base()` to `current`.
120
 
121
  *Returns:* `*this`.
122
 
123
+ #### Conversion <a id="reverse.iter.conv">[[reverse.iter.conv]]</a>
124
 
125
  ``` cpp
126
  constexpr Iterator base() const; // explicit
127
  ```
128
 
129
  *Returns:* `current`.
130
 
131
+ #### Element access <a id="reverse.iter.elem">[[reverse.iter.elem]]</a>
132
 
133
  ``` cpp
134
  constexpr reference operator*() const;
135
  ```
136
 
 
139
  ``` cpp
140
  Iterator tmp = current;
141
  return *--tmp;
142
  ```
143
 
144
+ ``` cpp
145
+ constexpr pointer operator->() const
146
+ requires (is_pointer_v<Iterator> ||
147
+ requires (const Iterator i) { i.operator->(); });
148
+ ```
149
+
150
+ *Effects:*
151
+
152
+ - If `Iterator` is a pointer type, equivalent to:
153
+ `return prev(current);`
154
+ - Otherwise, equivalent to: `return prev(current).operator->();`
155
+
156
+ ``` cpp
157
+ constexpr unspecified operator[](difference_type n) const;
158
+ ```
159
+
160
+ *Returns:* `current[-n-1]`.
161
+
162
+ #### Navigation <a id="reverse.iter.nav">[[reverse.iter.nav]]</a>
163
 
164
  ``` cpp
165
+ constexpr reverse_iterator operator+(difference_type n) const;
166
  ```
167
 
168
+ *Returns:* `reverse_iterator(current-n)`.
169
+
170
+ ``` cpp
171
+ constexpr reverse_iterator operator-(difference_type n) const;
172
+ ```
173
 
174
+ *Returns:* `reverse_iterator(current+n)`.
175
 
176
  ``` cpp
177
  constexpr reverse_iterator& operator++();
178
  ```
179
 
 
191
  reverse_iterator tmp = *this;
192
  --current;
193
  return tmp;
194
  ```
195
 
 
 
196
  ``` cpp
197
  constexpr reverse_iterator& operator--();
198
  ```
199
 
200
  *Effects:* As if by `++current`.
 
211
  reverse_iterator tmp = *this;
212
  ++current;
213
  return tmp;
214
  ```
215
 
 
 
 
 
 
 
 
 
 
 
216
  ``` cpp
217
  constexpr reverse_iterator& operator+=(difference_type n);
218
  ```
219
 
220
  *Effects:* As if by: `current -= n;`
221
 
222
  *Returns:* `*this`.
223
 
 
 
 
 
 
 
 
 
 
 
224
  ``` cpp
225
  constexpr reverse_iterator& operator-=(difference_type n);
226
  ```
227
 
228
  *Effects:* As if by: `current += n;`
229
 
230
  *Returns:* `*this`.
231
 
232
+ #### Comparisons <a id="reverse.iter.cmp">[[reverse.iter.cmp]]</a>
 
 
 
 
 
 
 
 
233
 
234
  ``` cpp
235
  template<class Iterator1, class Iterator2>
236
  constexpr bool operator==(
237
  const reverse_iterator<Iterator1>& x,
238
  const reverse_iterator<Iterator2>& y);
239
  ```
240
 
241
+ *Constraints:* `x.base() == y.base()` is well-formed and convertible to
242
+ `bool`.
243
 
244
+ *Returns:* `x.base() == y.base()`.
 
 
 
 
 
 
 
 
 
 
 
245
 
246
  ``` cpp
247
  template<class Iterator1, class Iterator2>
248
  constexpr bool operator!=(
249
  const reverse_iterator<Iterator1>& x,
250
  const reverse_iterator<Iterator2>& y);
251
  ```
252
 
253
+ *Constraints:* `x.base() != y.base()` is well-formed and convertible to
254
+ `bool`.
255
 
256
+ *Returns:* `x.base() != y.base()`.
257
+
258
+ ``` cpp
259
+ template<class Iterator1, class Iterator2>
260
+ constexpr bool operator<(
261
+ const reverse_iterator<Iterator1>& x,
262
+ const reverse_iterator<Iterator2>& y);
263
+ ```
264
+
265
+ *Constraints:* `x.base() > y.base()` is well-formed and convertible to
266
+ `bool`.
267
+
268
+ *Returns:* `x.base() > y.base()`.
269
 
270
  ``` cpp
271
  template<class Iterator1, class Iterator2>
272
  constexpr bool operator>(
273
  const reverse_iterator<Iterator1>& x,
274
  const reverse_iterator<Iterator2>& y);
275
  ```
276
 
277
+ *Constraints:* `x.base() < y.base()` is well-formed and convertible to
278
+ `bool`.
279
 
280
+ *Returns:* `x.base() < y.base()`.
 
 
 
 
 
 
 
 
 
 
 
281
 
282
  ``` cpp
283
  template<class Iterator1, class Iterator2>
284
  constexpr bool operator<=(
285
  const reverse_iterator<Iterator1>& x,
286
  const reverse_iterator<Iterator2>& y);
287
  ```
288
 
289
+ *Constraints:* `x.base() >= y.base()` is well-formed and convertible to
290
+ `bool`.
291
 
292
+ *Returns:* `x.base() >= y.base()`.
293
+
294
+ ``` cpp
295
+ template<class Iterator1, class Iterator2>
296
+ constexpr bool operator>=(
297
+ const reverse_iterator<Iterator1>& x,
298
+ const reverse_iterator<Iterator2>& y);
299
+ ```
300
+
301
+ *Constraints:* `x.base() <= y.base()` is well-formed and convertible to
302
+ `bool`.
303
+
304
+ *Returns:* `x.base() <= y.base()`.
305
+
306
+ ``` cpp
307
+ template<class Iterator1, three_way_comparable_with<Iterator1> Iterator2>
308
+ constexpr compare_three_way_result_t<Iterator1, Iterator2>
309
+ operator<=>(const reverse_iterator<Iterator1>& x,
310
+ const reverse_iterator<Iterator2>& y);
311
+ ```
312
+
313
+ *Returns:* `y.base() <=> x.base()`.
314
+
315
+ [*Note 1*: The argument order in the *Returns:* element is reversed
316
+ because this is a reverse iterator. — *end note*]
317
+
318
+ #### Non-member functions <a id="reverse.iter.nonmember">[[reverse.iter.nonmember]]</a>
319
 
320
  ``` cpp
321
  template<class Iterator1, class Iterator2>
322
  constexpr auto operator-(
323
  const reverse_iterator<Iterator1>& x,
324
  const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
325
  ```
326
 
327
+ *Returns:* `y.base() - x.base()`.
 
 
328
 
329
  ``` cpp
330
  template<class Iterator>
331
  constexpr reverse_iterator<Iterator> operator+(
332
  typename reverse_iterator<Iterator>::difference_type n,
333
  const reverse_iterator<Iterator>& x);
334
  ```
335
 
336
+ *Returns:* `reverse_iterator<Iterator>(x.base() - n)`.
337
 
338
+ ``` cpp
339
+ friend constexpr iter_rvalue_reference_t<Iterator>
340
+ iter_move(const reverse_iterator& i) noexcept(see below);
341
+ ```
342
+
343
+ *Effects:* Equivalent to:
344
+
345
+ ``` cpp
346
+ auto tmp = i.base();
347
+ return ranges::iter_move(--tmp);
348
+ ```
349
+
350
+ *Remarks:* The expression in `noexcept` is equivalent to:
351
+
352
+ ``` cpp
353
+ is_nothrow_copy_constructible_v<Iterator> &&
354
+ noexcept(ranges::iter_move(--declval<Iterator&>()))
355
+ ```
356
+
357
+ ``` cpp
358
+ template<indirectly_swappable<Iterator> Iterator2>
359
+ friend constexpr void
360
+ iter_swap(const reverse_iterator& x,
361
+ const reverse_iterator<Iterator2>& y) noexcept(see below);
362
+ ```
363
+
364
+ *Effects:* Equivalent to:
365
+
366
+ ``` cpp
367
+ auto xtmp = x.base();
368
+ auto ytmp = y.base();
369
+ ranges::iter_swap(--xtmp, --ytmp);
370
+ ```
371
+
372
+ *Remarks:* The expression in `noexcept` is equivalent to:
373
+
374
+ ``` cpp
375
+ is_nothrow_copy_constructible_v<Iterator> &&
376
+ is_nothrow_copy_constructible_v<Iterator2> &&
377
+ noexcept(ranges::iter_swap(--declval<Iterator&>(), --declval<Iterator2&>()))
378
+ ```
379
 
380
  ``` cpp
381
  template<class Iterator>
382
  constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
383
  ```