inline _GLIBCXX17_CONSTEXPR bool
operator==(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
+ // N.B. No contraints, x.base() == y.base() is always well-formed.
{ return __x.base() == __y.base(); }
#ifdef __cpp_lib_three_way_comparison
inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
operator+(typename move_iterator<_Iterator>::difference_type __n,
const move_iterator<_Iterator>& __x)
+#ifdef __glibcxx_concepts
+ requires requires { { __x.base() + __n } -> same_as<_Iterator>; }
+#endif
{ return __x + __n; }
template<typename _Iterator>
// { dg-do compile { target c++20 } }
#include <iterator>
+#include <testsuite_iterators.h>
template<int>
struct Iter
static_assert( beg <= cend );
static_assert( cend >= beg );
static_assert( std::is_lt(beg <=> cend) );
+
+template<typename I>
+ concept has_plus = requires(std::iter_difference_t<I> n, I i) {
+ { n + i } -> std::same_as<I>;
+ };
+
+using namespace __gnu_test;
+using MBI = std::move_iterator<bidirectional_iterator_wrapper<int>>;
+static_assert( ! has_plus<MBI> );
+using MRI = std::move_iterator<random_access_iterator_wrapper<int>>;
+static_assert( has_plus<MRI> );