Effects: Constructs a move_sentinel, value-initializing last. If is_trivially_default_constructible<S>::value is true, then this constructor is a constexpr constructor.
Effects: Constructs a move_sentinel, initializing last with s.
move_sentinel(const move_sentinel<ConvertibleTo<S>>& s);
Effects: Constructs a move_sentinel, initializing last with s.last.
move_sentinel& operator=(const move_sentinel<ConvertibleTo<S>>& s);
Effects: Assigns s.last to last.
Returns: *this.
template <class I, Sentinel<I> S>
constexpr bool operator==(
const move_iterator<I>& i, const move_sentinel<S>& s);
template <class I, Sentinel<I> S>
constexpr bool operator==(
const move_sentinel<S>& s, const move_iterator<I>& i);
Effects: Equivalent to: return i.current == s.last;
template <class I, Sentinel<I> S>
constexpr bool operator!=(
const move_iterator<I>& i, const move_sentinel<S>& s);
template <class I, Sentinel<I> S>
constexpr bool operator!=(
const move_sentinel<S>& s, const move_iterator<I>& i);
Effects: Equivalent to: return !(i == s);
template <class I, SizedSentinel<I> S>
constexpr difference_type_t<I> operator-(
const move_sentinel<S>& s, const move_iterator<I>& i);
Effects: Equivalent to: return s.last - i.current;
template <class I, SizedSentinel<I> S>
constexpr difference_type_t<I> operator-(
const move_iterator<I>& i, const move_sentinel<S>& s);
Effects: Equivalent to: return i.current - s.last;
template <Semiregular S>
constexpr move_sentinel<S> make_move_sentinel(S s);
Returns: move_sentinel<S>(s).