Implement unambiguous comparisons for RepeatedPtrIterator in C++20 (#9139)

Cherry-picked from master

Change-Id: I5eb7c929fdf7e7e70832c9a72375b4efdd120738
Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/protobuf/+/641162
Reviewed-by: Alexandre Zani <azani@google.com>
diff --git a/src/google/protobuf/repeated_ptr_field.h b/src/google/protobuf/repeated_ptr_field.h
index 7d635e3..3c813a9 100644
--- a/src/google/protobuf/repeated_ptr_field.h
+++ b/src/google/protobuf/repeated_ptr_field.h
@@ -1617,6 +1617,8 @@
   using iterator = RepeatedPtrIterator<Element>;
   using iterator_category = std::random_access_iterator_tag;
   using value_type = typename std::remove_const<Element>::type;
+  using const_iterator = RepeatedPtrIterator<const value_type>;
+  using nonconst_iterator = RepeatedPtrIterator<value_type>;
   using difference_type = std::ptrdiff_t;
   using pointer = Element*;
   using reference = Element&;
@@ -1652,14 +1654,20 @@
   iterator operator--(int) { return iterator(it_--); }
 
   // equality_comparable
-  bool operator==(const iterator& x) const { return it_ == x.it_; }
-  bool operator!=(const iterator& x) const { return it_ != x.it_; }
+  bool operator==(const nonconst_iterator& x) const { return it_ == x.it_; }
+  bool operator==(const const_iterator& x) const { return it_ == x.it_; }
+  bool operator!=(const nonconst_iterator& x) const { return it_ != x.it_; }
+  bool operator!=(const const_iterator& x) const { return it_ != x.it_; }
 
   // less_than_comparable
-  bool operator<(const iterator& x) const { return it_ < x.it_; }
-  bool operator<=(const iterator& x) const { return it_ <= x.it_; }
-  bool operator>(const iterator& x) const { return it_ > x.it_; }
-  bool operator>=(const iterator& x) const { return it_ >= x.it_; }
+  bool operator<(const nonconst_iterator& x) const { return it_ < x.it_; }
+  bool operator<(const const_iterator& x) const { return it_ < x.it_; }
+  bool operator<=(const nonconst_iterator& x) const { return it_ <= x.it_; }
+  bool operator<=(const const_iterator& x) const { return it_ <= x.it_; }
+  bool operator>(const nonconst_iterator& x) const { return it_ > x.it_; }
+  bool operator>(const const_iterator& x) const { return it_ > x.it_; }
+  bool operator>=(const nonconst_iterator& x) const { return it_ >= x.it_; }
+  bool operator>=(const const_iterator& x) const { return it_ >= x.it_; }
 
   // addable, subtractable
   iterator& operator+=(difference_type d) {