From Jason Turner

[predef.iterators]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpuwugfig3/{from.md → to.md} +212 -207
tmp/tmpuwugfig3/{from.md → to.md} RENAMED
@@ -11,94 +11,91 @@ identity: `&*(reverse_iterator(i)) == &*(i - 1)`.
11
  #### Class template `reverse_iterator` <a id="reverse.iterator">[[reverse.iterator]]</a>
12
 
13
  ``` cpp
14
  namespace std {
15
  template <class Iterator>
16
- class reverse_iterator : public
17
- iterator<typename iterator_traits<Iterator>::iterator_category,
18
- typename iterator_traits<Iterator>::value_type,
19
- typename iterator_traits<Iterator>::difference_type,
20
- typename iterator_traits<Iterator>::pointer,
21
- typename iterator_traits<Iterator>::reference> {
22
  public:
23
- typedef Iterator iterator_type;
24
- typedef typename iterator_traits<Iterator>::difference_type difference_type;
25
- typedef typename iterator_traits<Iterator>::reference reference;
26
- typedef typename iterator_traits<Iterator>::pointer pointer;
 
 
27
 
28
- reverse_iterator();
29
- explicit reverse_iterator(Iterator x);
30
- template <class U> reverse_iterator(const reverse_iterator<U>& u);
31
- template <class U> reverse_iterator& operator=(const reverse_iterator<U>& u);
32
 
33
- Iterator base() const; // explicit
34
- reference operator*() const;
35
- pointer operator->() const;
36
 
37
- reverse_iterator& operator++();
38
- reverse_iterator operator++(int);
39
- reverse_iterator& operator--();
40
- reverse_iterator operator--(int);
41
 
42
- reverse_iterator operator+ (difference_type n) const;
43
- reverse_iterator& operator+=(difference_type n);
44
- reverse_iterator operator- (difference_type n) const;
45
- reverse_iterator& operator-=(difference_type n);
46
- unspecified operator[](difference_type n) const;
47
  protected:
48
  Iterator current;
49
  };
50
 
51
  template <class Iterator1, class Iterator2>
52
- bool operator==(
53
  const reverse_iterator<Iterator1>& x,
54
  const reverse_iterator<Iterator2>& y);
55
  template <class Iterator1, class Iterator2>
56
- bool operator<(
57
  const reverse_iterator<Iterator1>& x,
58
  const reverse_iterator<Iterator2>& y);
59
  template <class Iterator1, class Iterator2>
60
- bool operator!=(
61
  const reverse_iterator<Iterator1>& x,
62
  const reverse_iterator<Iterator2>& y);
63
  template <class Iterator1, class Iterator2>
64
- bool operator>(
65
  const reverse_iterator<Iterator1>& x,
66
  const reverse_iterator<Iterator2>& y);
67
  template <class Iterator1, class Iterator2>
68
- bool operator>=(
69
  const reverse_iterator<Iterator1>& x,
70
  const reverse_iterator<Iterator2>& y);
71
  template <class Iterator1, class Iterator2>
72
- bool operator<=(
73
  const reverse_iterator<Iterator1>& x,
74
  const reverse_iterator<Iterator2>& y);
75
  template <class Iterator1, class Iterator2>
76
- auto operator-(
77
  const reverse_iterator<Iterator1>& x,
78
  const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
79
  template <class Iterator>
80
- reverse_iterator<Iterator> operator+(
81
  typename reverse_iterator<Iterator>::difference_type n,
82
  const reverse_iterator<Iterator>& x);
83
 
84
  template <class Iterator>
85
- reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
86
  }
87
  ```
88
 
89
  #### `reverse_iterator` requirements <a id="reverse.iter.requirements">[[reverse.iter.requirements]]</a>
90
 
91
  The template parameter `Iterator` shall meet all the requirements of a
92
  Bidirectional Iterator ([[bidirectional.iterators]]).
93
 
94
- Additionally, `Iterator` shall meet the requirements of a Random Access
95
- Iterator ([[random.access.iterators]]) if any of the members
96
  `operator+` ([[reverse.iter.op+]]), `operator-` (
97
  [[reverse.iter.op-]]), `operator+=` ([[reverse.iter.op+=]]),
98
  `operator-=` ([[reverse.iter.op-=]]), `operator[]` (
99
- [[reverse.iter.opindex]]), or the global operators `operator<` (
100
  [[reverse.iter.op<]]), `operator>` ([[reverse.iter.op>]]),
101
  `operator<=` ([[reverse.iter.op<=]]), `operator>=` (
102
  [[reverse.iter.op>=]]), `operator-` ([[reverse.iter.opdiff]]) or
103
  `operator+` ([[reverse.iter.opsum]]) are referenced in a way that
104
  requires instantiation ([[temp.inst]]).
@@ -106,257 +103,252 @@ requires instantiation ([[temp.inst]]).
106
  #### `reverse_iterator` operations <a id="reverse.iter.ops">[[reverse.iter.ops]]</a>
107
 
108
  ##### `reverse_iterator` constructor <a id="reverse.iter.cons">[[reverse.iter.cons]]</a>
109
 
110
  ``` cpp
111
- reverse_iterator();
112
  ```
113
 
114
- *Effects:* Value initializes `current`. Iterator operations applied to
115
  the resulting iterator have defined behavior if and only if the
116
  corresponding operations are defined on a value-initialized iterator of
117
  type `Iterator`.
118
 
119
  ``` cpp
120
- explicit reverse_iterator(Iterator x);
121
  ```
122
 
123
  *Effects:* Initializes `current` with `x`.
124
 
125
  ``` cpp
126
- template <class U> reverse_iterator(const reverse_iterator<U> &u);
127
  ```
128
 
129
  *Effects:* Initializes `current` with `u.current`.
130
 
131
  ##### `reverse_iterator::operator=` <a id="reverse.iter.op=">[[reverse.iter.op=]]</a>
132
 
133
  ``` cpp
134
  template <class U>
135
- reverse_iterator&
136
  operator=(const reverse_iterator<U>& u);
137
  ```
138
 
139
  *Effects:* Assigns `u.base()` to current.
140
 
141
  *Returns:* `*this`.
142
 
143
  ##### Conversion <a id="reverse.iter.conv">[[reverse.iter.conv]]</a>
144
 
145
  ``` cpp
146
- Iterator base() const; // explicit
147
  ```
148
 
149
  *Returns:* `current`.
150
 
151
  ##### `operator*` <a id="reverse.iter.op.star">[[reverse.iter.op.star]]</a>
152
 
153
  ``` cpp
154
- reference operator*() const;
155
  ```
156
 
157
- *Effects:*
158
 
159
  ``` cpp
160
  Iterator tmp = current;
161
  return *--tmp;
162
  ```
163
 
164
  ##### `operator->` <a id="reverse.iter.opref">[[reverse.iter.opref]]</a>
165
 
166
  ``` cpp
167
- pointer operator->() const;
168
  ```
169
 
170
- *Returns:* `std::addressof(operator*())`.
171
 
172
  ##### `operator++` <a id="reverse.iter.op++">[[reverse.iter.op++]]</a>
173
 
174
  ``` cpp
175
- reverse_iterator& operator++();
176
  ```
177
 
178
- *Effects:* `current;`
179
 
180
  *Returns:* `*this`.
181
 
182
  ``` cpp
183
- reverse_iterator operator++(int);
184
  ```
185
 
186
- *Effects:*
187
 
188
  ``` cpp
189
  reverse_iterator tmp = *this;
190
  --current;
191
  return tmp;
192
  ```
193
 
194
  \[reverse.iter.op\]`operator\dcr`
195
 
196
  ``` cpp
197
- reverse_iterator& operator--();
198
  ```
199
 
200
- *Effects:* `++current`
201
 
202
  *Returns:* `*this`.
203
 
204
  ``` cpp
205
- reverse_iterator operator--(int);
206
  ```
207
 
208
- *Effects:*
209
 
210
  ``` cpp
211
  reverse_iterator tmp = *this;
212
  ++current;
213
  return tmp;
214
  ```
215
 
216
  ##### `operator+` <a id="reverse.iter.op+">[[reverse.iter.op+]]</a>
217
 
218
  ``` cpp
219
- reverse_iterator
220
- operator+(typename reverse_iterator<Iterator>::difference_type n) const;
221
  ```
222
 
223
  *Returns:* `reverse_iterator(current-n)`.
224
 
225
  ##### `operator+=` <a id="reverse.iter.op+=">[[reverse.iter.op+=]]</a>
226
 
227
  ``` cpp
228
- reverse_iterator&
229
- operator+=(typename reverse_iterator<Iterator>::difference_type n);
230
  ```
231
 
232
- *Effects:* `current -= n;`
233
 
234
  *Returns:* `*this`.
235
 
236
  ##### `operator-` <a id="reverse.iter.op-">[[reverse.iter.op-]]</a>
237
 
238
  ``` cpp
239
- reverse_iterator
240
- operator-(typename reverse_iterator<Iterator>::difference_type n) const;
241
  ```
242
 
243
  *Returns:* `reverse_iterator(current+n)`.
244
 
245
  ##### `operator-=` <a id="reverse.iter.op-=">[[reverse.iter.op-=]]</a>
246
 
247
  ``` cpp
248
- reverse_iterator&
249
- operator-=(typename reverse_iterator<Iterator>::difference_type n);
250
  ```
251
 
252
- *Effects:* `current += n;`
253
 
254
  *Returns:* `*this`.
255
 
256
  ##### `operator[]` <a id="reverse.iter.opindex">[[reverse.iter.opindex]]</a>
257
 
258
  ``` cpp
259
- unspecified operator[](
260
- typename reverse_iterator<Iterator>::difference_type n) const;
261
  ```
262
 
263
  *Returns:* `current[-n-1]`.
264
 
265
  ##### `operator==` <a id="reverse.iter.op==">[[reverse.iter.op==]]</a>
266
 
267
  ``` cpp
268
  template <class Iterator1, class Iterator2>
269
- bool operator==(
270
  const reverse_iterator<Iterator1>& x,
271
  const reverse_iterator<Iterator2>& y);
272
  ```
273
 
274
  *Returns:* `x.current == y.current`.
275
 
276
  ##### `operator<` <a id="reverse.iter.op<">[[reverse.iter.op<]]</a>
277
 
278
  ``` cpp
279
  template <class Iterator1, class Iterator2>
280
- bool operator<(
281
  const reverse_iterator<Iterator1>& x,
282
  const reverse_iterator<Iterator2>& y);
283
  ```
284
 
285
  *Returns:* `x.current > y.current`.
286
 
287
  ##### `operator!=` <a id="reverse.iter.op!=">[[reverse.iter.op!=]]</a>
288
 
289
  ``` cpp
290
  template <class Iterator1, class Iterator2>
291
- bool operator!=(
292
  const reverse_iterator<Iterator1>& x,
293
  const reverse_iterator<Iterator2>& y);
294
  ```
295
 
296
  *Returns:* `x.current != y.current`.
297
 
298
  ##### `operator>` <a id="reverse.iter.op>">[[reverse.iter.op>]]</a>
299
 
300
  ``` cpp
301
  template <class Iterator1, class Iterator2>
302
- bool operator>(
303
  const reverse_iterator<Iterator1>& x,
304
  const reverse_iterator<Iterator2>& y);
305
  ```
306
 
307
  *Returns:* `x.current < y.current`.
308
 
309
  ##### `operator>=` <a id="reverse.iter.op>=">[[reverse.iter.op>=]]</a>
310
 
311
  ``` cpp
312
  template <class Iterator1, class Iterator2>
313
- bool operator>=(
314
  const reverse_iterator<Iterator1>& x,
315
  const reverse_iterator<Iterator2>& y);
316
  ```
317
 
318
  *Returns:* `x.current <= y.current`.
319
 
320
  ##### `operator<=` <a id="reverse.iter.op<=">[[reverse.iter.op<=]]</a>
321
 
322
  ``` cpp
323
  template <class Iterator1, class Iterator2>
324
- bool operator<=(
325
  const reverse_iterator<Iterator1>& x,
326
  const reverse_iterator<Iterator2>& y);
327
  ```
328
 
329
  *Returns:* `x.current >= y.current`.
330
 
331
  ##### `operator-` <a id="reverse.iter.opdiff">[[reverse.iter.opdiff]]</a>
332
 
333
  ``` cpp
334
  template <class Iterator1, class Iterator2>
335
- auto operator-(
336
  const reverse_iterator<Iterator1>& x,
337
  const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
338
  ```
339
 
340
  *Returns:* `y.current - x.current`.
341
 
342
  ##### `operator+` <a id="reverse.iter.opsum">[[reverse.iter.opsum]]</a>
343
 
344
  ``` cpp
345
  template <class Iterator>
346
- reverse_iterator<Iterator> operator+(
347
  typename reverse_iterator<Iterator>::difference_type n,
348
  const reverse_iterator<Iterator>& x);
349
  ```
350
 
351
  *Returns:* `reverse_iterator<Iterator> (x.current - n)`.
352
 
353
  ##### Non-member function `make_reverse_iterator()` <a id="reverse.iter.make">[[reverse.iter.make]]</a>
354
 
355
  ``` cpp
356
  template <class Iterator>
357
- reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
358
  ```
359
 
360
  *Returns:* `reverse_iterator<Iterator>(i)`.
361
 
362
  ### Insert iterators <a id="insert.iterators">[[insert.iterators]]</a>
@@ -393,26 +385,29 @@ iterators out of a container.
393
  #### Class template `back_insert_iterator` <a id="back.insert.iterator">[[back.insert.iterator]]</a>
394
 
395
  ``` cpp
396
  namespace std {
397
  template <class Container>
398
- class back_insert_iterator :
399
- public iterator<output_iterator_tag,void,void,void,void> {
400
  protected:
401
  Container* container;
402
 
403
  public:
404
- typedef Container container_type;
 
 
 
 
 
 
405
  explicit back_insert_iterator(Container& x);
406
- back_insert_iterator<Container>&
407
- operator=(const typename Container::value_type& value);
408
- back_insert_iterator<Container>&
409
- operator=(typename Container::value_type&& value);
410
 
411
- back_insert_iterator<Container>& operator*();
412
- back_insert_iterator<Container>& operator++();
413
- back_insert_iterator<Container> operator++(int);
414
  };
415
 
416
  template <class Container>
417
  back_insert_iterator<Container> back_inserter(Container& x);
418
  }
@@ -424,45 +419,43 @@ namespace std {
424
 
425
  ``` cpp
426
  explicit back_insert_iterator(Container& x);
427
  ```
428
 
429
- *Effects:* Initializes `container` with `std::addressof(x)`.
430
 
431
  ##### `back_insert_iterator::operator=` <a id="back.insert.iter.op=">[[back.insert.iter.op=]]</a>
432
 
433
  ``` cpp
434
- back_insert_iterator<Container>&
435
- operator=(const typename Container::value_type& value);
436
  ```
437
 
438
- *Effects:* `container->push_back(value);`
439
 
440
  *Returns:* `*this`.
441
 
442
  ``` cpp
443
- back_insert_iterator<Container>&
444
- operator=(typename Container::value_type&& value);
445
  ```
446
 
447
- *Effects:* `container->push_back(std::move(value));`
448
 
449
  *Returns:* `*this`.
450
 
451
  ##### `back_insert_iterator::operator*` <a id="back.insert.iter.op*">[[back.insert.iter.op*]]</a>
452
 
453
  ``` cpp
454
- back_insert_iterator<Container>& operator*();
455
  ```
456
 
457
  *Returns:* `*this`.
458
 
459
  ##### `back_insert_iterator::operator++` <a id="back.insert.iter.op++">[[back.insert.iter.op++]]</a>
460
 
461
  ``` cpp
462
- back_insert_iterator<Container>& operator++();
463
- back_insert_iterator<Container> operator++(int);
464
  ```
465
 
466
  *Returns:* `*this`.
467
 
468
  ##### `back_inserter` <a id="back.inserter">[[back.inserter]]</a>
@@ -477,26 +470,29 @@ template <class Container>
477
  #### Class template `front_insert_iterator` <a id="front.insert.iterator">[[front.insert.iterator]]</a>
478
 
479
  ``` cpp
480
  namespace std {
481
  template <class Container>
482
- class front_insert_iterator :
483
- public iterator<output_iterator_tag,void,void,void,void> {
484
  protected:
485
  Container* container;
486
 
487
  public:
488
- typedef Container container_type;
 
 
 
 
 
 
489
  explicit front_insert_iterator(Container& x);
490
- front_insert_iterator<Container>&
491
- operator=(const typename Container::value_type& value);
492
- front_insert_iterator<Container>&
493
- operator=(typename Container::value_type&& value);
494
 
495
- front_insert_iterator<Container>& operator*();
496
- front_insert_iterator<Container>& operator++();
497
- front_insert_iterator<Container> operator++(int);
498
  };
499
 
500
  template <class Container>
501
  front_insert_iterator<Container> front_inserter(Container& x);
502
  }
@@ -508,45 +504,43 @@ namespace std {
508
 
509
  ``` cpp
510
  explicit front_insert_iterator(Container& x);
511
  ```
512
 
513
- *Effects:* Initializes `container` with `std::addressof(x)`.
514
 
515
  ##### `front_insert_iterator::operator=` <a id="front.insert.iter.op=">[[front.insert.iter.op=]]</a>
516
 
517
  ``` cpp
518
- front_insert_iterator<Container>&
519
- operator=(const typename Container::value_type& value);
520
  ```
521
 
522
- *Effects:* `container->push_front(value);`
523
 
524
  *Returns:* `*this`.
525
 
526
  ``` cpp
527
- front_insert_iterator<Container>&
528
- operator=(typename Container::value_type&& value);
529
  ```
530
 
531
- *Effects:* `container->push_front(std::move(value));`
532
 
533
  *Returns:* `*this`.
534
 
535
  ##### `front_insert_iterator::operator*` <a id="front.insert.iter.op*">[[front.insert.iter.op*]]</a>
536
 
537
  ``` cpp
538
- front_insert_iterator<Container>& operator*();
539
  ```
540
 
541
  *Returns:* `*this`.
542
 
543
  ##### `front_insert_iterator::operator++` <a id="front.insert.iter.op++">[[front.insert.iter.op++]]</a>
544
 
545
  ``` cpp
546
- front_insert_iterator<Container>& operator++();
547
- front_insert_iterator<Container> operator++(int);
548
  ```
549
 
550
  *Returns:* `*this`.
551
 
552
  ##### `front_inserter` <a id="front.inserter">[[front.inserter]]</a>
@@ -561,27 +555,30 @@ template <class Container>
561
  #### Class template `insert_iterator` <a id="insert.iterator">[[insert.iterator]]</a>
562
 
563
  ``` cpp
564
  namespace std {
565
  template <class Container>
566
- class insert_iterator :
567
- public iterator<output_iterator_tag,void,void,void,void> {
568
  protected:
569
  Container* container;
570
  typename Container::iterator iter;
571
 
572
  public:
573
- typedef Container container_type;
 
 
 
 
 
 
574
  insert_iterator(Container& x, typename Container::iterator i);
575
- insert_iterator<Container>&
576
- operator=(const typename Container::value_type& value);
577
- insert_iterator<Container>&
578
- operator=(typename Container::value_type&& value);
579
 
580
- insert_iterator<Container>& operator*();
581
- insert_iterator<Container>& operator++();
582
- insert_iterator<Container>& operator++(int);
583
  };
584
 
585
  template <class Container>
586
  insert_iterator<Container> inserter(Container& x, typename Container::iterator i);
587
  }
@@ -593,35 +590,33 @@ namespace std {
593
 
594
  ``` cpp
595
  insert_iterator(Container& x, typename Container::iterator i);
596
  ```
597
 
598
- *Effects:* Initializes `container` with `std::addressof(x)` and `iter`
599
- with `i`.
600
 
601
  ##### `insert_iterator::operator=` <a id="insert.iter.op=">[[insert.iter.op=]]</a>
602
 
603
  ``` cpp
604
- insert_iterator<Container>&
605
- operator=(const typename Container::value_type& value);
606
  ```
607
 
608
- *Effects:*
609
 
610
  ``` cpp
611
  iter = container->insert(iter, value);
612
  ++iter;
613
  ```
614
 
615
  *Returns:* `*this`.
616
 
617
  ``` cpp
618
- insert_iterator<Container>&
619
- operator=(typename Container::value_type&& value);
620
  ```
621
 
622
- *Effects:*
623
 
624
  ``` cpp
625
  iter = container->insert(iter, std::move(value));
626
  ++iter;
627
  ```
@@ -629,20 +624,20 @@ iter = container->insert(iter, std::move(value));
629
  *Returns:* `*this`.
630
 
631
  ##### `insert_iterator::operator*` <a id="insert.iter.op*">[[insert.iter.op*]]</a>
632
 
633
  ``` cpp
634
- insert_iterator<Container>& operator*();
635
  ```
636
 
637
  *Returns:* `*this`.
638
 
639
  ##### `insert_iterator::operator++` <a id="insert.iter.op++">[[insert.iter.op++]]</a>
640
 
641
  ``` cpp
642
- insert_iterator<Container>& operator++();
643
- insert_iterator<Container>& operator++(int);
644
  ```
645
 
646
  *Returns:* `*this`.
647
 
648
  ##### `inserter` <a id="inserter">[[inserter]]</a>
@@ -657,315 +652,325 @@ template <class Container>
657
  ### Move iterators <a id="move.iterators">[[move.iterators]]</a>
658
 
659
  Class template `move_iterator` is an iterator adaptor with the same
660
  behavior as the underlying iterator except that its indirection operator
661
  implicitly converts the value returned by the underlying iterator’s
662
- indirection operator to an rvalue reference. Some generic algorithms can
663
- be called with move iterators to replace copying with moving.
 
 
664
 
665
  ``` cpp
666
  list<string> s;
667
  // populate the list s
668
  vector<string> v1(s.begin(), s.end()); // copies strings into v1
669
  vector<string> v2(make_move_iterator(s.begin()),
670
  make_move_iterator(s.end())); // moves strings into v2
671
  ```
672
 
 
 
673
  #### Class template `move_iterator` <a id="move.iterator">[[move.iterator]]</a>
674
 
675
  ``` cpp
676
  namespace std {
677
  template <class Iterator>
678
  class move_iterator {
679
  public:
680
- typedef Iterator iterator_type;
681
- typedef typename iterator_traits<Iterator>::difference_type difference_type;
682
- typedef Iterator pointer;
683
- typedef typename iterator_traits<Iterator>::value_type value_type;
684
- typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
685
- typedef value_type&& reference;
686
 
687
- move_iterator();
688
- explicit move_iterator(Iterator i);
689
- template <class U> move_iterator(const move_iterator<U>& u);
690
- template <class U> move_iterator& operator=(const move_iterator<U>& u);
691
 
692
- iterator_type base() const;
693
- reference operator*() const;
694
- pointer operator->() const;
695
 
696
- move_iterator& operator++();
697
- move_iterator operator++(int);
698
- move_iterator& operator--();
699
- move_iterator operator--(int);
700
 
701
- move_iterator operator+(difference_type n) const;
702
- move_iterator& operator+=(difference_type n);
703
- move_iterator operator-(difference_type n) const;
704
- move_iterator& operator-=(difference_type n);
705
- unspecified operator[](difference_type n) const;
706
 
707
  private:
708
  Iterator current; // exposition only
709
  };
710
 
711
  template <class Iterator1, class Iterator2>
712
- bool operator==(
713
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
714
  template <class Iterator1, class Iterator2>
715
- bool operator!=(
716
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
717
  template <class Iterator1, class Iterator2>
718
- bool operator<(
719
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
720
  template <class Iterator1, class Iterator2>
721
- bool operator<=(
722
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
723
  template <class Iterator1, class Iterator2>
724
- bool operator>(
725
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
726
  template <class Iterator1, class Iterator2>
727
- bool operator>=(
728
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
729
 
730
  template <class Iterator1, class Iterator2>
731
- auto operator-(
732
  const move_iterator<Iterator1>& x,
733
  const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
734
  template <class Iterator>
735
- move_iterator<Iterator> operator+(
736
  typename move_iterator<Iterator>::difference_type n, const move_iterator<Iterator>& x);
737
  template <class Iterator>
738
- move_iterator<Iterator> make_move_iterator(Iterator i);
739
  }
740
  ```
741
 
 
 
 
 
 
 
742
  #### `move_iterator` requirements <a id="move.iter.requirements">[[move.iter.requirements]]</a>
743
 
744
- The template parameter `Iterator` shall meet the requirements for an
745
- Input Iterator ([[input.iterators]]). Additionally, if any of the
746
  bidirectional or random access traversal functions are instantiated, the
747
  template parameter shall meet the requirements for a Bidirectional
748
  Iterator ([[bidirectional.iterators]]) or a Random Access Iterator (
749
  [[random.access.iterators]]), respectively.
750
 
751
  #### `move_iterator` operations <a id="move.iter.ops">[[move.iter.ops]]</a>
752
 
753
  ##### `move_iterator` constructors <a id="move.iter.op.const">[[move.iter.op.const]]</a>
754
 
755
  ``` cpp
756
- move_iterator();
757
  ```
758
 
759
- *Effects:* Constructs a `move_iterator`, value initializing `current`.
760
  Iterator operations applied to the resulting iterator have defined
761
  behavior if and only if the corresponding operations are defined on a
762
  value-initialized iterator of type `Iterator`.
763
 
764
  ``` cpp
765
- explicit move_iterator(Iterator i);
766
  ```
767
 
768
  *Effects:* Constructs a `move_iterator`, initializing `current` with
769
  `i`.
770
 
771
  ``` cpp
772
- template <class U> move_iterator(const move_iterator<U>& u);
773
  ```
774
 
775
  *Effects:* Constructs a `move_iterator`, initializing `current` with
776
  `u.base()`.
777
 
778
  *Requires:* `U` shall be convertible to `Iterator`.
779
 
780
  ##### `move_iterator::operator=` <a id="move.iter.op=">[[move.iter.op=]]</a>
781
 
782
  ``` cpp
783
- template <class U> move_iterator& operator=(const move_iterator<U>& u);
784
  ```
785
 
786
  *Effects:* Assigns `u.base()` to `current`.
787
 
788
  *Requires:* `U` shall be convertible to `Iterator`.
789
 
790
  ##### `move_iterator` conversion <a id="move.iter.op.conv">[[move.iter.op.conv]]</a>
791
 
792
  ``` cpp
793
- Iterator base() const;
794
  ```
795
 
796
  *Returns:* `current`.
797
 
798
  ##### `move_iterator::operator*` <a id="move.iter.op.star">[[move.iter.op.star]]</a>
799
 
800
  ``` cpp
801
- reference operator*() const;
802
  ```
803
 
804
- *Returns:* `std::move(`\*current).
805
 
806
  ##### `move_iterator::operator->` <a id="move.iter.op.ref">[[move.iter.op.ref]]</a>
807
 
808
  ``` cpp
809
- pointer operator->() const;
810
  ```
811
 
812
  *Returns:* `current`.
813
 
814
  ##### `move_iterator::operator++` <a id="move.iter.op.incr">[[move.iter.op.incr]]</a>
815
 
816
  ``` cpp
817
- move_iterator& operator++();
818
  ```
819
 
820
- *Effects:* `++current`.
821
 
822
  *Returns:* `*this`.
823
 
824
  ``` cpp
825
- move_iterator operator++(int);
826
  ```
827
 
828
- *Effects:*
829
 
830
  ``` cpp
831
  move_iterator tmp = *this;
832
  ++current;
833
  return tmp;
834
  ```
835
 
836
  ##### `move_iterator::operator-{-}` <a id="move.iter.op.decr">[[move.iter.op.decr]]</a>
837
 
838
  ``` cpp
839
- move_iterator& operator--();
840
  ```
841
 
842
- *Effects:* \dcr`current`.
843
 
844
  *Returns:* `*this`.
845
 
846
  ``` cpp
847
- move_iterator operator--(int);
848
  ```
849
 
850
- *Effects:*
851
 
852
  ``` cpp
853
  move_iterator tmp = *this;
854
  --current;
855
  return tmp;
856
  ```
857
 
858
  ##### `move_iterator::operator+` <a id="move.iter.op.+">[[move.iter.op.+]]</a>
859
 
860
  ``` cpp
861
- move_iterator operator+(difference_type n) const;
862
  ```
863
 
864
  *Returns:* `move_iterator(current + n)`.
865
 
866
  ##### `move_iterator::operator+=` <a id="move.iter.op.+=">[[move.iter.op.+=]]</a>
867
 
868
  ``` cpp
869
- move_iterator& operator+=(difference_type n);
870
  ```
871
 
872
- *Effects:* `current += n`.
873
 
874
  *Returns:* `*this`.
875
 
876
  ##### `move_iterator::operator-` <a id="move.iter.op.-">[[move.iter.op.-]]</a>
877
 
878
  ``` cpp
879
- move_iterator operator-(difference_type n) const;
880
  ```
881
 
882
  *Returns:* `move_iterator(current - n)`.
883
 
884
  ##### `move_iterator::operator-=` <a id="move.iter.op.-=">[[move.iter.op.-=]]</a>
885
 
886
  ``` cpp
887
- move_iterator& operator-=(difference_type n);
888
  ```
889
 
890
- *Effects:* `current -= n`.
891
 
892
  *Returns:* `*this`.
893
 
894
  ##### `move_iterator::operator[]` <a id="move.iter.op.index">[[move.iter.op.index]]</a>
895
 
896
  ``` cpp
897
- unspecified operator[](difference_type n) const;
898
  ```
899
 
900
- *Returns:* `std::move(`current\[n\]).
901
 
902
  ##### `move_iterator` comparisons <a id="move.iter.op.comp">[[move.iter.op.comp]]</a>
903
 
904
  ``` cpp
905
  template <class Iterator1, class Iterator2>
906
- bool operator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
907
  ```
908
 
909
  *Returns:* `x.base() == y.base()`.
910
 
911
  ``` cpp
912
  template <class Iterator1, class Iterator2>
913
- bool operator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
914
  ```
915
 
916
  *Returns:* `!(x == y)`.
917
 
918
  ``` cpp
919
  template <class Iterator1, class Iterator2>
920
- bool operator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
921
  ```
922
 
923
  *Returns:* `x.base() < y.base()`.
924
 
925
  ``` cpp
926
  template <class Iterator1, class Iterator2>
927
- bool operator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
928
  ```
929
 
930
  *Returns:* `!(y < x)`.
931
 
932
  ``` cpp
933
  template <class Iterator1, class Iterator2>
934
- bool operator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
935
  ```
936
 
937
  *Returns:* `y < x`.
938
 
939
  ``` cpp
940
  template <class Iterator1, class Iterator2>
941
- bool operator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
942
  ```
943
 
944
  *Returns:* `!(x < y)`.
945
 
946
  ##### `move_iterator` non-member functions <a id="move.iter.nonmember">[[move.iter.nonmember]]</a>
947
 
948
  ``` cpp
949
  template <class Iterator1, class Iterator2>
950
- auto operator-(
951
  const move_iterator<Iterator1>& x,
952
  const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
953
  ```
954
 
955
  *Returns:* `x.base() - y.base()`.
956
 
957
  ``` cpp
958
  template <class Iterator>
959
- move_iterator<Iterator> operator+(
960
  typename move_iterator<Iterator>::difference_type n, const move_iterator<Iterator>& x);
961
  ```
962
 
963
  *Returns:* `x + n`.
964
 
965
  ``` cpp
966
  template <class Iterator>
967
- move_iterator<Iterator> make_move_iterator(Iterator i);
968
  ```
969
 
970
  *Returns:* `move_iterator<Iterator>(i)`.
971
 
 
11
  #### Class template `reverse_iterator` <a id="reverse.iterator">[[reverse.iterator]]</a>
12
 
13
  ``` cpp
14
  namespace std {
15
  template <class Iterator>
16
+ class reverse_iterator {
 
 
 
 
 
17
  public:
18
+ using iterator_type = Iterator;
19
+ using iterator_category = typename iterator_traits<Iterator>::iterator_category;
20
+ using value_type = typename iterator_traits<Iterator>::value_type;
21
+ using difference_type = typename iterator_traits<Iterator>::difference_type;
22
+ using pointer = typename iterator_traits<Iterator>::pointer;
23
+ using reference = typename iterator_traits<Iterator>::reference;
24
 
25
+ constexpr reverse_iterator();
26
+ constexpr explicit reverse_iterator(Iterator x);
27
+ template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
28
+ template <class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);
29
 
30
+ constexpr Iterator base() const; // explicit
31
+ constexpr reference operator*() const;
32
+ constexpr pointer operator->() const;
33
 
34
+ constexpr reverse_iterator& operator++();
35
+ constexpr reverse_iterator operator++(int);
36
+ constexpr reverse_iterator& operator--();
37
+ constexpr reverse_iterator operator--(int);
38
 
39
+ constexpr reverse_iterator operator+ (difference_type n) const;
40
+ constexpr reverse_iterator& operator+=(difference_type n);
41
+ constexpr reverse_iterator operator- (difference_type n) const;
42
+ constexpr reverse_iterator& operator-=(difference_type n);
43
+ constexpr unspecified operator[](difference_type n) const;
44
  protected:
45
  Iterator current;
46
  };
47
 
48
  template <class Iterator1, class Iterator2>
49
+ constexpr bool operator==(
50
  const reverse_iterator<Iterator1>& x,
51
  const reverse_iterator<Iterator2>& y);
52
  template <class Iterator1, class Iterator2>
53
+ constexpr bool operator<(
54
  const reverse_iterator<Iterator1>& x,
55
  const reverse_iterator<Iterator2>& y);
56
  template <class Iterator1, class Iterator2>
57
+ constexpr bool operator!=(
58
  const reverse_iterator<Iterator1>& x,
59
  const reverse_iterator<Iterator2>& y);
60
  template <class Iterator1, class Iterator2>
61
+ constexpr bool operator>(
62
  const reverse_iterator<Iterator1>& x,
63
  const reverse_iterator<Iterator2>& y);
64
  template <class Iterator1, class Iterator2>
65
+ constexpr bool operator>=(
66
  const reverse_iterator<Iterator1>& x,
67
  const reverse_iterator<Iterator2>& y);
68
  template <class Iterator1, class Iterator2>
69
+ constexpr bool operator<=(
70
  const reverse_iterator<Iterator1>& x,
71
  const reverse_iterator<Iterator2>& y);
72
  template <class Iterator1, class Iterator2>
73
+ constexpr auto operator-(
74
  const reverse_iterator<Iterator1>& x,
75
  const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
76
  template <class Iterator>
77
+ constexpr reverse_iterator<Iterator> operator+(
78
  typename reverse_iterator<Iterator>::difference_type n,
79
  const reverse_iterator<Iterator>& x);
80
 
81
  template <class Iterator>
82
+ constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
83
  }
84
  ```
85
 
86
  #### `reverse_iterator` requirements <a id="reverse.iter.requirements">[[reverse.iter.requirements]]</a>
87
 
88
  The template parameter `Iterator` shall meet all the requirements of a
89
  Bidirectional Iterator ([[bidirectional.iterators]]).
90
 
91
+ Additionally, `Iterator` shall meet the requirements of a random access
92
+ iterator ([[random.access.iterators]]) if any of the members
93
  `operator+` ([[reverse.iter.op+]]), `operator-` (
94
  [[reverse.iter.op-]]), `operator+=` ([[reverse.iter.op+=]]),
95
  `operator-=` ([[reverse.iter.op-=]]), `operator[]` (
96
+ [[reverse.iter.opindex]]), or the non-member operators `operator<` (
97
  [[reverse.iter.op<]]), `operator>` ([[reverse.iter.op>]]),
98
  `operator<=` ([[reverse.iter.op<=]]), `operator>=` (
99
  [[reverse.iter.op>=]]), `operator-` ([[reverse.iter.opdiff]]) or
100
  `operator+` ([[reverse.iter.opsum]]) are referenced in a way that
101
  requires instantiation ([[temp.inst]]).
 
103
  #### `reverse_iterator` operations <a id="reverse.iter.ops">[[reverse.iter.ops]]</a>
104
 
105
  ##### `reverse_iterator` constructor <a id="reverse.iter.cons">[[reverse.iter.cons]]</a>
106
 
107
  ``` cpp
108
+ constexpr reverse_iterator();
109
  ```
110
 
111
+ *Effects:* Value-initializes `current`. Iterator operations applied to
112
  the resulting iterator have defined behavior if and only if the
113
  corresponding operations are defined on a value-initialized iterator of
114
  type `Iterator`.
115
 
116
  ``` cpp
117
+ constexpr explicit reverse_iterator(Iterator x);
118
  ```
119
 
120
  *Effects:* Initializes `current` with `x`.
121
 
122
  ``` cpp
123
+ template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
124
  ```
125
 
126
  *Effects:* Initializes `current` with `u.current`.
127
 
128
  ##### `reverse_iterator::operator=` <a id="reverse.iter.op=">[[reverse.iter.op=]]</a>
129
 
130
  ``` cpp
131
  template <class U>
132
+ constexpr reverse_iterator&
133
  operator=(const reverse_iterator<U>& u);
134
  ```
135
 
136
  *Effects:* Assigns `u.base()` to current.
137
 
138
  *Returns:* `*this`.
139
 
140
  ##### Conversion <a id="reverse.iter.conv">[[reverse.iter.conv]]</a>
141
 
142
  ``` cpp
143
+ constexpr Iterator base() const; // explicit
144
  ```
145
 
146
  *Returns:* `current`.
147
 
148
  ##### `operator*` <a id="reverse.iter.op.star">[[reverse.iter.op.star]]</a>
149
 
150
  ``` cpp
151
+ constexpr reference operator*() const;
152
  ```
153
 
154
+ *Effects:* As if by:
155
 
156
  ``` cpp
157
  Iterator tmp = current;
158
  return *--tmp;
159
  ```
160
 
161
  ##### `operator->` <a id="reverse.iter.opref">[[reverse.iter.opref]]</a>
162
 
163
  ``` cpp
164
+ constexpr pointer operator->() const;
165
  ```
166
 
167
+ *Returns:* `addressof(operator*())`.
168
 
169
  ##### `operator++` <a id="reverse.iter.op++">[[reverse.iter.op++]]</a>
170
 
171
  ``` cpp
172
+ constexpr reverse_iterator& operator++();
173
  ```
174
 
175
+ *Effects:* As if by: `current;`
176
 
177
  *Returns:* `*this`.
178
 
179
  ``` cpp
180
+ constexpr reverse_iterator operator++(int);
181
  ```
182
 
183
+ *Effects:* As if by:
184
 
185
  ``` cpp
186
  reverse_iterator tmp = *this;
187
  --current;
188
  return tmp;
189
  ```
190
 
191
  \[reverse.iter.op\]`operator\dcr`
192
 
193
  ``` cpp
194
+ constexpr reverse_iterator& operator--();
195
  ```
196
 
197
+ *Effects:* As if by `++current`.
198
 
199
  *Returns:* `*this`.
200
 
201
  ``` cpp
202
+ constexpr reverse_iterator operator--(int);
203
  ```
204
 
205
+ *Effects:* As if by:
206
 
207
  ``` cpp
208
  reverse_iterator tmp = *this;
209
  ++current;
210
  return tmp;
211
  ```
212
 
213
  ##### `operator+` <a id="reverse.iter.op+">[[reverse.iter.op+]]</a>
214
 
215
  ``` cpp
216
+ constexpr reverse_iterator operator+(difference_type n) const;
 
217
  ```
218
 
219
  *Returns:* `reverse_iterator(current-n)`.
220
 
221
  ##### `operator+=` <a id="reverse.iter.op+=">[[reverse.iter.op+=]]</a>
222
 
223
  ``` cpp
224
+ constexpr reverse_iterator& operator+=(difference_type n);
 
225
  ```
226
 
227
+ *Effects:* As if by: `current -= n;`
228
 
229
  *Returns:* `*this`.
230
 
231
  ##### `operator-` <a id="reverse.iter.op-">[[reverse.iter.op-]]</a>
232
 
233
  ``` cpp
234
+ constexpr reverse_iterator operator-(difference_type n) const;
 
235
  ```
236
 
237
  *Returns:* `reverse_iterator(current+n)`.
238
 
239
  ##### `operator-=` <a id="reverse.iter.op-=">[[reverse.iter.op-=]]</a>
240
 
241
  ``` cpp
242
+ constexpr reverse_iterator& operator-=(difference_type n);
 
243
  ```
244
 
245
+ *Effects:* As if by: `current += n;`
246
 
247
  *Returns:* `*this`.
248
 
249
  ##### `operator[]` <a id="reverse.iter.opindex">[[reverse.iter.opindex]]</a>
250
 
251
  ``` cpp
252
+ constexpr unspecified operator[](difference_type n) const;
 
253
  ```
254
 
255
  *Returns:* `current[-n-1]`.
256
 
257
  ##### `operator==` <a id="reverse.iter.op==">[[reverse.iter.op==]]</a>
258
 
259
  ``` cpp
260
  template <class Iterator1, class Iterator2>
261
+ constexpr bool operator==(
262
  const reverse_iterator<Iterator1>& x,
263
  const reverse_iterator<Iterator2>& y);
264
  ```
265
 
266
  *Returns:* `x.current == y.current`.
267
 
268
  ##### `operator<` <a id="reverse.iter.op<">[[reverse.iter.op<]]</a>
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
  *Returns:* `x.current > y.current`.
278
 
279
  ##### `operator!=` <a id="reverse.iter.op!=">[[reverse.iter.op!=]]</a>
280
 
281
  ``` cpp
282
  template <class Iterator1, class Iterator2>
283
+ constexpr bool operator!=(
284
  const reverse_iterator<Iterator1>& x,
285
  const reverse_iterator<Iterator2>& y);
286
  ```
287
 
288
  *Returns:* `x.current != y.current`.
289
 
290
  ##### `operator>` <a id="reverse.iter.op>">[[reverse.iter.op>]]</a>
291
 
292
  ``` cpp
293
  template <class Iterator1, class Iterator2>
294
+ constexpr bool operator>(
295
  const reverse_iterator<Iterator1>& x,
296
  const reverse_iterator<Iterator2>& y);
297
  ```
298
 
299
  *Returns:* `x.current < y.current`.
300
 
301
  ##### `operator>=` <a id="reverse.iter.op>=">[[reverse.iter.op>=]]</a>
302
 
303
  ``` cpp
304
  template <class Iterator1, class Iterator2>
305
+ constexpr bool operator>=(
306
  const reverse_iterator<Iterator1>& x,
307
  const reverse_iterator<Iterator2>& y);
308
  ```
309
 
310
  *Returns:* `x.current <= y.current`.
311
 
312
  ##### `operator<=` <a id="reverse.iter.op<=">[[reverse.iter.op<=]]</a>
313
 
314
  ``` cpp
315
  template <class Iterator1, class Iterator2>
316
+ constexpr bool operator<=(
317
  const reverse_iterator<Iterator1>& x,
318
  const reverse_iterator<Iterator2>& y);
319
  ```
320
 
321
  *Returns:* `x.current >= y.current`.
322
 
323
  ##### `operator-` <a id="reverse.iter.opdiff">[[reverse.iter.opdiff]]</a>
324
 
325
  ``` cpp
326
  template <class Iterator1, class Iterator2>
327
+ constexpr auto operator-(
328
  const reverse_iterator<Iterator1>& x,
329
  const reverse_iterator<Iterator2>& y) -> decltype(y.base() - x.base());
330
  ```
331
 
332
  *Returns:* `y.current - x.current`.
333
 
334
  ##### `operator+` <a id="reverse.iter.opsum">[[reverse.iter.opsum]]</a>
335
 
336
  ``` cpp
337
  template <class Iterator>
338
+ constexpr reverse_iterator<Iterator> operator+(
339
  typename reverse_iterator<Iterator>::difference_type n,
340
  const reverse_iterator<Iterator>& x);
341
  ```
342
 
343
  *Returns:* `reverse_iterator<Iterator> (x.current - n)`.
344
 
345
  ##### Non-member function `make_reverse_iterator()` <a id="reverse.iter.make">[[reverse.iter.make]]</a>
346
 
347
  ``` cpp
348
  template <class Iterator>
349
+ constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i);
350
  ```
351
 
352
  *Returns:* `reverse_iterator<Iterator>(i)`.
353
 
354
  ### Insert iterators <a id="insert.iterators">[[insert.iterators]]</a>
 
385
  #### Class template `back_insert_iterator` <a id="back.insert.iterator">[[back.insert.iterator]]</a>
386
 
387
  ``` cpp
388
  namespace std {
389
  template <class Container>
390
+ class back_insert_iterator {
 
391
  protected:
392
  Container* container;
393
 
394
  public:
395
+ using iterator_category = output_iterator_tag;
396
+ using value_type = void;
397
+ using difference_type = void;
398
+ using pointer = void;
399
+ using reference = void;
400
+ using container_type = Container;
401
+
402
  explicit back_insert_iterator(Container& x);
403
+ back_insert_iterator& operator=(const typename Container::value_type& value);
404
+ back_insert_iterator& operator=(typename Container::value_type&& value);
 
 
405
 
406
+ back_insert_iterator& operator*();
407
+ back_insert_iterator& operator++();
408
+ back_insert_iterator operator++(int);
409
  };
410
 
411
  template <class Container>
412
  back_insert_iterator<Container> back_inserter(Container& x);
413
  }
 
419
 
420
  ``` cpp
421
  explicit back_insert_iterator(Container& x);
422
  ```
423
 
424
+ *Effects:* Initializes `container` with `addressof(x)`.
425
 
426
  ##### `back_insert_iterator::operator=` <a id="back.insert.iter.op=">[[back.insert.iter.op=]]</a>
427
 
428
  ``` cpp
429
+ back_insert_iterator& operator=(const typename Container::value_type& value);
 
430
  ```
431
 
432
+ *Effects:* As if by: `container->push_back(value);`
433
 
434
  *Returns:* `*this`.
435
 
436
  ``` cpp
437
+ back_insert_iterator& operator=(typename Container::value_type&& value);
 
438
  ```
439
 
440
+ *Effects:* As if by: `container->push_back(std::move(value));`
441
 
442
  *Returns:* `*this`.
443
 
444
  ##### `back_insert_iterator::operator*` <a id="back.insert.iter.op*">[[back.insert.iter.op*]]</a>
445
 
446
  ``` cpp
447
+ back_insert_iterator& operator*();
448
  ```
449
 
450
  *Returns:* `*this`.
451
 
452
  ##### `back_insert_iterator::operator++` <a id="back.insert.iter.op++">[[back.insert.iter.op++]]</a>
453
 
454
  ``` cpp
455
+ back_insert_iterator& operator++();
456
+ back_insert_iterator operator++(int);
457
  ```
458
 
459
  *Returns:* `*this`.
460
 
461
  ##### `back_inserter` <a id="back.inserter">[[back.inserter]]</a>
 
470
  #### Class template `front_insert_iterator` <a id="front.insert.iterator">[[front.insert.iterator]]</a>
471
 
472
  ``` cpp
473
  namespace std {
474
  template <class Container>
475
+ class front_insert_iterator {
 
476
  protected:
477
  Container* container;
478
 
479
  public:
480
+ using iterator_category = output_iterator_tag;
481
+ using value_type = void;
482
+ using difference_type = void;
483
+ using pointer = void;
484
+ using reference = void;
485
+ using container_type = Container;
486
+
487
  explicit front_insert_iterator(Container& x);
488
+ front_insert_iterator& operator=(const typename Container::value_type& value);
489
+ front_insert_iterator& operator=(typename Container::value_type&& value);
 
 
490
 
491
+ front_insert_iterator& operator*();
492
+ front_insert_iterator& operator++();
493
+ front_insert_iterator operator++(int);
494
  };
495
 
496
  template <class Container>
497
  front_insert_iterator<Container> front_inserter(Container& x);
498
  }
 
504
 
505
  ``` cpp
506
  explicit front_insert_iterator(Container& x);
507
  ```
508
 
509
+ *Effects:* Initializes `container` with `addressof(x)`.
510
 
511
  ##### `front_insert_iterator::operator=` <a id="front.insert.iter.op=">[[front.insert.iter.op=]]</a>
512
 
513
  ``` cpp
514
+ front_insert_iterator& operator=(const typename Container::value_type& value);
 
515
  ```
516
 
517
+ *Effects:* As if by: `container->push_front(value);`
518
 
519
  *Returns:* `*this`.
520
 
521
  ``` cpp
522
+ front_insert_iterator& operator=(typename Container::value_type&& value);
 
523
  ```
524
 
525
+ *Effects:* As if by: `container->push_front(std::move(value));`
526
 
527
  *Returns:* `*this`.
528
 
529
  ##### `front_insert_iterator::operator*` <a id="front.insert.iter.op*">[[front.insert.iter.op*]]</a>
530
 
531
  ``` cpp
532
+ front_insert_iterator& operator*();
533
  ```
534
 
535
  *Returns:* `*this`.
536
 
537
  ##### `front_insert_iterator::operator++` <a id="front.insert.iter.op++">[[front.insert.iter.op++]]</a>
538
 
539
  ``` cpp
540
+ front_insert_iterator& operator++();
541
+ front_insert_iterator operator++(int);
542
  ```
543
 
544
  *Returns:* `*this`.
545
 
546
  ##### `front_inserter` <a id="front.inserter">[[front.inserter]]</a>
 
555
  #### Class template `insert_iterator` <a id="insert.iterator">[[insert.iterator]]</a>
556
 
557
  ``` cpp
558
  namespace std {
559
  template <class Container>
560
+ class insert_iterator {
 
561
  protected:
562
  Container* container;
563
  typename Container::iterator iter;
564
 
565
  public:
566
+ using iterator_category = output_iterator_tag;
567
+ using value_type = void;
568
+ using difference_type = void;
569
+ using pointer = void;
570
+ using reference = void;
571
+ using container_type = Container;
572
+
573
  insert_iterator(Container& x, typename Container::iterator i);
574
+ insert_iterator& operator=(const typename Container::value_type& value);
575
+ insert_iterator& operator=(typename Container::value_type&& value);
 
 
576
 
577
+ insert_iterator& operator*();
578
+ insert_iterator& operator++();
579
+ insert_iterator& operator++(int);
580
  };
581
 
582
  template <class Container>
583
  insert_iterator<Container> inserter(Container& x, typename Container::iterator i);
584
  }
 
590
 
591
  ``` cpp
592
  insert_iterator(Container& x, typename Container::iterator i);
593
  ```
594
 
595
+ *Effects:* Initializes `container` with `addressof(x)` and `iter` with
596
+ `i`.
597
 
598
  ##### `insert_iterator::operator=` <a id="insert.iter.op=">[[insert.iter.op=]]</a>
599
 
600
  ``` cpp
601
+ insert_iterator& operator=(const typename Container::value_type& value);
 
602
  ```
603
 
604
+ *Effects:* As if by:
605
 
606
  ``` cpp
607
  iter = container->insert(iter, value);
608
  ++iter;
609
  ```
610
 
611
  *Returns:* `*this`.
612
 
613
  ``` cpp
614
+ insert_iterator& operator=(typename Container::value_type&& value);
 
615
  ```
616
 
617
+ *Effects:* As if by:
618
 
619
  ``` cpp
620
  iter = container->insert(iter, std::move(value));
621
  ++iter;
622
  ```
 
624
  *Returns:* `*this`.
625
 
626
  ##### `insert_iterator::operator*` <a id="insert.iter.op*">[[insert.iter.op*]]</a>
627
 
628
  ``` cpp
629
+ insert_iterator& operator*();
630
  ```
631
 
632
  *Returns:* `*this`.
633
 
634
  ##### `insert_iterator::operator++` <a id="insert.iter.op++">[[insert.iter.op++]]</a>
635
 
636
  ``` cpp
637
+ insert_iterator& operator++();
638
+ insert_iterator& operator++(int);
639
  ```
640
 
641
  *Returns:* `*this`.
642
 
643
  ##### `inserter` <a id="inserter">[[inserter]]</a>
 
652
  ### Move iterators <a id="move.iterators">[[move.iterators]]</a>
653
 
654
  Class template `move_iterator` is an iterator adaptor with the same
655
  behavior as the underlying iterator except that its indirection operator
656
  implicitly converts the value returned by the underlying iterator’s
657
+ indirection operator to an rvalue. Some generic algorithms can be called
658
+ with move iterators to replace copying with moving.
659
+
660
+ [*Example 1*:
661
 
662
  ``` cpp
663
  list<string> s;
664
  // populate the list s
665
  vector<string> v1(s.begin(), s.end()); // copies strings into v1
666
  vector<string> v2(make_move_iterator(s.begin()),
667
  make_move_iterator(s.end())); // moves strings into v2
668
  ```
669
 
670
+ — *end example*]
671
+
672
  #### Class template `move_iterator` <a id="move.iterator">[[move.iterator]]</a>
673
 
674
  ``` cpp
675
  namespace std {
676
  template <class Iterator>
677
  class move_iterator {
678
  public:
679
+ using iterator_type = Iterator;
680
+ using iterator_category = typename iterator_traits<Iterator>::iterator_category;
681
+ using value_type = typename iterator_traits<Iterator>::value_type;
682
+ using difference_type = typename iterator_traits<Iterator>::difference_type;
683
+ using pointer = Iterator;
684
+ using reference = see below;
685
 
686
+ constexpr move_iterator();
687
+ constexpr explicit move_iterator(Iterator i);
688
+ template <class U> constexpr move_iterator(const move_iterator<U>& u);
689
+ template <class U> constexpr move_iterator& operator=(const move_iterator<U>& u);
690
 
691
+ constexpr iterator_type base() const;
692
+ constexpr reference operator*() const;
693
+ constexpr pointer operator->() const;
694
 
695
+ constexpr move_iterator& operator++();
696
+ constexpr move_iterator operator++(int);
697
+ constexpr move_iterator& operator--();
698
+ constexpr move_iterator operator--(int);
699
 
700
+ constexpr move_iterator operator+(difference_type n) const;
701
+ constexpr move_iterator& operator+=(difference_type n);
702
+ constexpr move_iterator operator-(difference_type n) const;
703
+ constexpr move_iterator& operator-=(difference_type n);
704
+ constexpr unspecified operator[](difference_type n) const;
705
 
706
  private:
707
  Iterator current; // exposition only
708
  };
709
 
710
  template <class Iterator1, class Iterator2>
711
+ constexpr bool operator==(
712
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
713
  template <class Iterator1, class Iterator2>
714
+ constexpr bool operator!=(
715
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
716
  template <class Iterator1, class Iterator2>
717
+ constexpr bool operator<(
718
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
719
  template <class Iterator1, class Iterator2>
720
+ constexpr bool operator<=(
721
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
722
  template <class Iterator1, class Iterator2>
723
+ constexpr bool operator>(
724
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
725
  template <class Iterator1, class Iterator2>
726
+ constexpr bool operator>=(
727
  const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
728
 
729
  template <class Iterator1, class Iterator2>
730
+ constexpr auto operator-(
731
  const move_iterator<Iterator1>& x,
732
  const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
733
  template <class Iterator>
734
+ constexpr move_iterator<Iterator> operator+(
735
  typename move_iterator<Iterator>::difference_type n, const move_iterator<Iterator>& x);
736
  template <class Iterator>
737
+ constexpr move_iterator<Iterator> make_move_iterator(Iterator i);
738
  }
739
  ```
740
 
741
+ Let `R` denote `iterator_traits<Iterator>::reference`. If
742
+ `is_reference_v<R>` is `true`, the template specialization
743
+ `move_iterator<Iterator>` shall define the nested type named `reference`
744
+ as a synonym for `remove_reference_t<R>&&`, otherwise as a synonym for
745
+ `R`.
746
+
747
  #### `move_iterator` requirements <a id="move.iter.requirements">[[move.iter.requirements]]</a>
748
 
749
+ The template parameter `Iterator` shall meet the requirements of an
750
+ input iterator ([[input.iterators]]). Additionally, if any of the
751
  bidirectional or random access traversal functions are instantiated, the
752
  template parameter shall meet the requirements for a Bidirectional
753
  Iterator ([[bidirectional.iterators]]) or a Random Access Iterator (
754
  [[random.access.iterators]]), respectively.
755
 
756
  #### `move_iterator` operations <a id="move.iter.ops">[[move.iter.ops]]</a>
757
 
758
  ##### `move_iterator` constructors <a id="move.iter.op.const">[[move.iter.op.const]]</a>
759
 
760
  ``` cpp
761
+ constexpr move_iterator();
762
  ```
763
 
764
+ *Effects:* Constructs a `move_iterator`, value-initializing `current`.
765
  Iterator operations applied to the resulting iterator have defined
766
  behavior if and only if the corresponding operations are defined on a
767
  value-initialized iterator of type `Iterator`.
768
 
769
  ``` cpp
770
+ constexpr explicit move_iterator(Iterator i);
771
  ```
772
 
773
  *Effects:* Constructs a `move_iterator`, initializing `current` with
774
  `i`.
775
 
776
  ``` cpp
777
+ template <class U> constexpr move_iterator(const move_iterator<U>& u);
778
  ```
779
 
780
  *Effects:* Constructs a `move_iterator`, initializing `current` with
781
  `u.base()`.
782
 
783
  *Requires:* `U` shall be convertible to `Iterator`.
784
 
785
  ##### `move_iterator::operator=` <a id="move.iter.op=">[[move.iter.op=]]</a>
786
 
787
  ``` cpp
788
+ template <class U> constexpr move_iterator& operator=(const move_iterator<U>& u);
789
  ```
790
 
791
  *Effects:* Assigns `u.base()` to `current`.
792
 
793
  *Requires:* `U` shall be convertible to `Iterator`.
794
 
795
  ##### `move_iterator` conversion <a id="move.iter.op.conv">[[move.iter.op.conv]]</a>
796
 
797
  ``` cpp
798
+ constexpr Iterator base() const;
799
  ```
800
 
801
  *Returns:* `current`.
802
 
803
  ##### `move_iterator::operator*` <a id="move.iter.op.star">[[move.iter.op.star]]</a>
804
 
805
  ``` cpp
806
+ constexpr reference operator*() const;
807
  ```
808
 
809
+ *Returns:* `static_cast<reference>(*current)`.
810
 
811
  ##### `move_iterator::operator->` <a id="move.iter.op.ref">[[move.iter.op.ref]]</a>
812
 
813
  ``` cpp
814
+ constexpr pointer operator->() const;
815
  ```
816
 
817
  *Returns:* `current`.
818
 
819
  ##### `move_iterator::operator++` <a id="move.iter.op.incr">[[move.iter.op.incr]]</a>
820
 
821
  ``` cpp
822
+ constexpr move_iterator& operator++();
823
  ```
824
 
825
+ *Effects:* As if by `++current`.
826
 
827
  *Returns:* `*this`.
828
 
829
  ``` cpp
830
+ constexpr move_iterator operator++(int);
831
  ```
832
 
833
+ *Effects:* As if by:
834
 
835
  ``` cpp
836
  move_iterator tmp = *this;
837
  ++current;
838
  return tmp;
839
  ```
840
 
841
  ##### `move_iterator::operator-{-}` <a id="move.iter.op.decr">[[move.iter.op.decr]]</a>
842
 
843
  ``` cpp
844
+ constexpr move_iterator& operator--();
845
  ```
846
 
847
+ *Effects:* As if by `current`.
848
 
849
  *Returns:* `*this`.
850
 
851
  ``` cpp
852
+ constexpr move_iterator operator--(int);
853
  ```
854
 
855
+ *Effects:* As if by:
856
 
857
  ``` cpp
858
  move_iterator tmp = *this;
859
  --current;
860
  return tmp;
861
  ```
862
 
863
  ##### `move_iterator::operator+` <a id="move.iter.op.+">[[move.iter.op.+]]</a>
864
 
865
  ``` cpp
866
+ constexpr move_iterator operator+(difference_type n) const;
867
  ```
868
 
869
  *Returns:* `move_iterator(current + n)`.
870
 
871
  ##### `move_iterator::operator+=` <a id="move.iter.op.+=">[[move.iter.op.+=]]</a>
872
 
873
  ``` cpp
874
+ constexpr move_iterator& operator+=(difference_type n);
875
  ```
876
 
877
+ *Effects:* As if by: `current += n;`
878
 
879
  *Returns:* `*this`.
880
 
881
  ##### `move_iterator::operator-` <a id="move.iter.op.-">[[move.iter.op.-]]</a>
882
 
883
  ``` cpp
884
+ constexpr move_iterator operator-(difference_type n) const;
885
  ```
886
 
887
  *Returns:* `move_iterator(current - n)`.
888
 
889
  ##### `move_iterator::operator-=` <a id="move.iter.op.-=">[[move.iter.op.-=]]</a>
890
 
891
  ``` cpp
892
+ constexpr move_iterator& operator-=(difference_type n);
893
  ```
894
 
895
+ *Effects:* As if by: `current -= n;`
896
 
897
  *Returns:* `*this`.
898
 
899
  ##### `move_iterator::operator[]` <a id="move.iter.op.index">[[move.iter.op.index]]</a>
900
 
901
  ``` cpp
902
+ constexpr unspecified operator[](difference_type n) const;
903
  ```
904
 
905
+ *Returns:* `std::move(current[n])`.
906
 
907
  ##### `move_iterator` comparisons <a id="move.iter.op.comp">[[move.iter.op.comp]]</a>
908
 
909
  ``` cpp
910
  template <class Iterator1, class Iterator2>
911
+ constexpr bool operator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
912
  ```
913
 
914
  *Returns:* `x.base() == y.base()`.
915
 
916
  ``` cpp
917
  template <class Iterator1, class Iterator2>
918
+ constexpr bool operator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
919
  ```
920
 
921
  *Returns:* `!(x == y)`.
922
 
923
  ``` cpp
924
  template <class Iterator1, class Iterator2>
925
+ constexpr bool operator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
926
  ```
927
 
928
  *Returns:* `x.base() < y.base()`.
929
 
930
  ``` cpp
931
  template <class Iterator1, class Iterator2>
932
+ constexpr bool operator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
933
  ```
934
 
935
  *Returns:* `!(y < x)`.
936
 
937
  ``` cpp
938
  template <class Iterator1, class Iterator2>
939
+ constexpr bool operator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
940
  ```
941
 
942
  *Returns:* `y < x`.
943
 
944
  ``` cpp
945
  template <class Iterator1, class Iterator2>
946
+ constexpr bool operator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
947
  ```
948
 
949
  *Returns:* `!(x < y)`.
950
 
951
  ##### `move_iterator` non-member functions <a id="move.iter.nonmember">[[move.iter.nonmember]]</a>
952
 
953
  ``` cpp
954
  template <class Iterator1, class Iterator2>
955
+ constexpr auto operator-(
956
  const move_iterator<Iterator1>& x,
957
  const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
958
  ```
959
 
960
  *Returns:* `x.base() - y.base()`.
961
 
962
  ``` cpp
963
  template <class Iterator>
964
+ constexpr move_iterator<Iterator> operator+(
965
  typename move_iterator<Iterator>::difference_type n, const move_iterator<Iterator>& x);
966
  ```
967
 
968
  *Returns:* `x + n`.
969
 
970
  ``` cpp
971
  template <class Iterator>
972
+ constexpr move_iterator<Iterator> make_move_iterator(Iterator i);
973
  ```
974
 
975
  *Returns:* `move_iterator<Iterator>(i)`.
976