9 Iterators library [iterators]

9.7 Iterator adaptors [iterators.predef]

9.7.3 Move iterators and sentinels [iterators.move]

9.7.3.2 move_iterator operations [move.iter.ops]

9.7.3.2.1 move_iterator constructors [move.iter.op.const]

constexpr move_iterator();

Effects: Constructs a move_iterator, value-initializing current. Iterator operations applied to the resulting iterator have defined behavior if and only if the corresponding operations are defined on a value-initialized iterator of type I.

explicit constexpr move_iterator(I i);

Effects: Constructs a move_iterator, initializing current with i.

constexpr move_iterator(const move_iterator<ConvertibleTo<I>>& i);

Effects: Constructs a move_iterator, initializing current with i.current.

9.7.3.2.2 move_iterator::operator= [move.iter.op=]

constexpr move_iterator& operator=(const move_iterator<ConvertibleTo<I>>& i);

Effects: Assigns i.current to current.

9.7.3.2.3 move_iterator conversion [move.iter.op.conv]

constexpr I base() const;

Returns: current.

9.7.3.2.4 move_iterator::operator* [move.iter.op.star]

constexpr reference operator*() const;

Effects: Equivalent to: return iter_move(current);

9.7.3.2.5 move_iterator::operator++ [move.iter.op.incr]

constexpr move_iterator& operator++();

Effects: Equivalent to ++current.

Returns: *this.

constexpr void operator++(int);

Effects: Equivalent to ++current.

constexpr move_iterator operator++(int) requires ForwardIterator<I>;

Effects: Equivalent to:

move_iterator tmp = *this;
++current;
return tmp;

9.7.3.2.6 move_iterator::operator-- [move.iter.op.decr]

constexpr move_iterator& operator--() requires BidirectionalIterator<I>;

Effects: Equivalent to --current.

Returns: *this.

constexpr move_iterator operator--(int) requires BidirectionalIterator<I>;

Effects: Equivalent to:

move_iterator tmp = *this;
--current;
return tmp;

9.7.3.2.7 move_iterator::operator+ [move.iter.op.+]

constexpr move_iterator operator+(difference_type n) const requires RandomAccessIterator<I>;

Effects: Equivalent to: return move_iterator(current + n);

9.7.3.2.8 move_iterator::operator+= [move.iter.op.+=]

constexpr move_iterator& operator+=(difference_type n) requires RandomAccessIterator<I>;

Effects: Equivalent to current += n.

Returns: *this.

9.7.3.2.9 move_iterator::operator- [move.iter.op.-]

constexpr move_iterator operator-(difference_type n) const requires RandomAccessIterator<I>;

Effects: Equivalent to: return move_iterator(current - n);

9.7.3.2.10 move_iterator::operator-= [move.iter.op.-=]

constexpr move_iterator& operator-=(difference_type n) requires RandomAccessIterator<I>;

Effects: Equivalent to current -= n.

Returns: *this.

9.7.3.2.11 move_iterator::operator[] [move.iter.op.index]

constexpr reference operator[](difference_type n) const requires RandomAccessIterator<I>;

Effects: Equivalent to: return iter_move(current + n);

9.7.3.2.12 move_iterator comparisons [move.iter.op.comp]

template <class I1, class I2> requires EqualityComparableWith<I1, I2> constexpr bool operator==( const move_iterator<I1>& x, const move_iterator<I2>& y);

Effects: Equivalent to: return x.current == y.current;

template <class I1, class I2> requires EqualityComparableWith<I1, I2> constexpr bool operator!=( const move_iterator<I1>& x, const move_iterator<I2>& y);

Effects: Equivalent to: return !(x == y);

template <class I1, class I2> requires StrictTotallyOrderedWith<I1, I2> constexpr bool operator<( const move_iterator<I1>& x, const move_iterator<I2>& y);

Effects: Equivalent to: return x.current < y.current;

template <class I1, class I2> requires StrictTotallyOrderedWith<I1, I2> constexpr bool operator<=( const move_iterator<I1>& x, const move_iterator<I2>& y);

Effects: Equivalent to: return !(y < x);

template <class I1, class I2> requires StrictTotallyOrderedWith<I1, I2> constexpr bool operator>( const move_iterator<I1>& x, const move_iterator<I2>& y);

Effects: Equivalent to: return y < x;

template <class I1, class I2> requires StrictTotallyOrderedWith<I1, I2> constexpr bool operator>=( const move_iterator<I1>& x, const move_iterator<I2>& y);

Effects: Equivalent to: return !(x < y);.

9.7.3.2.13 move_iterator non-member functions [move.iter.nonmember]

template <class I1, class I2> requires SizedSentinel<I1, I2> constexpr difference_type_t<I2> operator-( const move_iterator<I1>& x, const move_iterator<I2>& y);

Effects: Equivalent to: return x.current - y.current;

template <RandomAccessIterator I> constexpr move_iterator<I> operator+( difference_type_t<I> n, const move_iterator<I>& x);

Effects: Equivalent to: return x + n;

friend constexpr rvalue_reference_t<I> iter_move(const move_iterator& i) noexcept(see below);

Effects: Equivalent to: return ranges::iter_move(i.current);

Remarks: The expression in noexcept is equivalent to:

noexcept(ranges::iter_move(i.current))

template <IndirectlySwappable<I> I2> friend constexpr void iter_swap(const move_iterator& x, const move_iterator<I2>& y) noexcept(see below);

Effects: Equivalent to: ranges::iter_swap(x.current, y.current).

Remarks: The expression in noexcept is equivalent to:

noexcept(ranges::iter_swap(x.current, y.current))

template <InputIterator I> constexpr move_iterator<I> make_move_iterator(I i);

Returns: move_iterator<I>(i).