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 Iterator.
explicit move_iterator(Iterator i);
Effects: Constructs a move_iterator, initializing current with i.
template <class U> move_iterator(const move_iterator<U>& u);
Effects: Constructs a move_iterator, initializing current with u.base().
Requires: U shall be convertible to Iterator.
template <class U> move_iterator& operator=(const move_iterator<U>& u);
Effects: Assigns u.base() to current.
Requires: U shall be convertible to Iterator.
Returns: std::move(*current).
Returns: current.
Effects: ++current.
Returns: *this.
move_iterator operator++(int);
Effects:
move_iterator tmp = *this; ++current; return tmp;
Effects: --current.
Returns: *this.
move_iterator operator--(int);
Effects:
move_iterator tmp = *this; --current; return tmp;
move_iterator operator+(difference_type n) const;
Returns: move_iterator(current + n).
move_iterator& operator+=(difference_type n);
Effects: current += n.
Returns: *this.
move_iterator operator-(difference_type n) const;
Returns: move_iterator(current - n).
move_iterator& operator-=(difference_type n);
Effects: current -= n.
Returns: *this.
unspecified operator[](difference_type n) const;
Returns: std::move(current[n]).
template <class Iterator1, class Iterator2>
bool operator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
Returns: x.base() == y.base().
template <class Iterator1, class Iterator2>
bool operator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
Returns: !(x == y).
template <class Iterator1, class Iterator2>
bool operator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
Returns: x.base() < y.base().
template <class Iterator1, class Iterator2>
bool operator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
Returns: !(y < x).
template <class Iterator1, class Iterator2>
bool operator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
Returns: y < x.
template <class Iterator1, class Iterator2>
bool operator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
Returns: !(x < y).
template <class Iterator1, class Iterator2>
auto operator-(
const move_iterator<Iterator1>& x,
const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
Returns: x.base() - y.base().
template <class Iterator>
move_iterator<Iterator> operator+(
typename move_iterator<Iterator>::difference_type n, const move_iterator<Iterator>& x);
Returns: x + n.
template <class Iterator>
move_iterator<Iterator> make_move_iterator(const Iterator& i);
Returns: move_iterator<Iterator>(i).