[committed 2/3] libstdc++: Add remaining C++20 changes to iterator adaptors

Jonathan Wakely jwakely@redhat.com
Sat Mar 28 00:16:38 GMT 2020


On 27/03/20 23:29 +0000, Jonathan Wakely wrote:
>@@ -403,6 +428,49 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>     operator>=(const reverse_iterator<_IteratorL>& __x,
> 	       const reverse_iterator<_IteratorR>& __y)
>     { return !(__x < __y); }
>+#else // C++20
>+  template<typename _IteratorL, typename _IteratorR>
>+    constexpr auto
>+    operator==(const reverse_iterator<_IteratorL>& __x,
>+	       const reverse_iterator<_IteratorR>& __y)
>+    -> decltype(__detail::__convbool(__x.base() == __y.base()))
>+    { return __x.base() == __y.base(); }
>+
>+  template<typename _IteratorL, typename _IteratorR>
>+    constexpr auto
>+    operator!=(const reverse_iterator<_IteratorL>& __x,
>+	       const reverse_iterator<_IteratorR>& __y)
>+    -> decltype(__detail::__convbool(__x.base() != __y.base()))
>+    { return __x.base() != __y.base(); }
>+
>+  template<typename _IteratorL, typename _IteratorR>
>+    constexpr auto
>+    operator<(const reverse_iterator<_IteratorL>& __x,
>+	      const reverse_iterator<_IteratorR>& __y)
>+    -> decltype(__detail::__convbool(__x.base() < __y.base()))
>+    { return __x.base() < __y.base(); }

Drat, these relational operators use the wrong operator. The sense
needs to be flipped because they're reverse_iterators.

Looks like I lost an edit to this file that I made on another machine,
and committed the wrong version. I'll fix it ASAP.

>+  template<typename _IteratorL, typename _IteratorR>
>+    constexpr auto
>+    operator>(const reverse_iterator<_IteratorL>& __x,
>+	      const reverse_iterator<_IteratorR>& __y)
>+    -> decltype(__detail::__convbool(__x.base() > __y.base()))
>+    { return __x.base() > __y.base(); }
>+
>+  template<typename _IteratorL, typename _IteratorR>
>+    constexpr auto
>+    operator<=(const reverse_iterator<_IteratorL>& __x,
>+	       const reverse_iterator<_IteratorR>& __y)
>+    -> decltype(__detail::__convbool(__x.base() <= __y.base()))
>+    { return __x.base() <= __y.base(); }
>+
>+  template<typename _IteratorL, typename _IteratorR>
>+    constexpr auto
>+    operator>=(const reverse_iterator<_IteratorL>& __x,
>+	       const reverse_iterator<_IteratorR>& __y)
>+    -> decltype(__detail::__convbool(__x.base() >= __y.base()))
>+    { return __x.base() >= __y.base(); }
>+#endif // C++20
>   //@}
> 
> #if __cplusplus < 201103L



More information about the Libstdc++ mailing list