]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
buffer: constrain conversions of buffers_t iterators
authorCasey Bodley <cbodley@redhat.com>
Fri, 11 Feb 2022 23:26:22 +0000 (18:26 -0500)
committerKefu Chai <tchaikov@gmail.com>
Thu, 17 Mar 2022 14:00:35 +0000 (22:00 +0800)
prevent conversions from const_iterator -> iterator to resolve a c++20
compilation error with clang 13:

ceph/src/include/buffer.h:537:18: error: use of overloaded operator '==' is ambiguous (with operand types 'ceph::buffer::list::buffers_t::const_iterator' (aka 'buffers_iterator<const ceph::buffer::ptr_node>') and 'ceph::buffer::list::buffers_t::iterator' (aka 'buffers_iterator<ceph::buffer::ptr_node>'
))
        _root.next = it == end() ? &item : _root.next;
                     ~~ ^  ~~~~~
ceph/src/include/buffer.h:471:7: note: candidate function
        bool operator==(const buffers_iterator& rhs) const {
             ^
ceph/src/include/buffer.h:471:7: note: candidate function (with reversed parameter order)

Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/include/buffer.h

index 8a28d846d9d467c45bbd1e32061bdd4659c8c2c0..5e3fdf4b40bd43b8a19dd20e54503aac32babca1 100644 (file)
@@ -440,7 +440,13 @@ struct error_code;
        buffers_iterator(U* const p)
          : cur(p) {
        }
-       template <class U>
+       // copy constructor
+       buffers_iterator(const buffers_iterator<T>& other)
+         : cur(other.cur) {
+       }
+       // converting constructor, from iterator -> const_iterator only
+       template <class U, typename std::enable_if<
+           std::is_const<T>::value && !std::is_const<U>::value, int>::type = 0>
        buffers_iterator(const buffers_iterator<U>& other)
          : cur(other.cur) {
        }
@@ -475,11 +481,6 @@ struct error_code;
        bool operator!=(const buffers_iterator& rhs) const {
          return !(*this==rhs);
        }
-
-       using citer_t = buffers_iterator<typename std::add_const<T>::type>;
-       operator citer_t() const {
-         return citer_t(cur);
-       }
       };
 
       typedef buffers_iterator<const ptr_node> const_iterator;