首页 > 解决方案 > C++20:从自定义迭代器制作反向迭代器失败

问题描述

我正在我的 B-Tree 实现上从我的自定义迭代器制作一个反向迭代器,但它无法工作。

完整代码:https ://wandbox.org/permlink/hrM32RYb6oVHDHAm

我的迭代器实现:

class BTreeIterator {
        using difference_type = std::ptrdiff_t;
        using value_type = T;
        using pointer = T*;
        using reference = T&;
        using iterator_category = std::bidirectional_iterator_tag;
        
        Node* node;
        std::vector<T>::iterator it;
        
        void Increment() {
               // ...
        }
        
        void Decrement() {
              // ...      
        }
        
    public:
        BTreeIterator(Node* node, std::size_t i) : node {node} {
            assert(node && i <= node->key.size());
            it = node->key.begin() + i;
        }
        
        reference operator*() const {
            return *it;
        }
        
        pointer operator->() const {
            return it;
        }
        
        BTreeIterator& operator++() {
            Increment();
            return *this;
        }
        
        BTreeIterator operator++(int) {
            BTreeIterator temp = *this;
            Increment();
            return temp;
        }
        
        BTreeIterator& operator--() {
            Decrement();
            return *this;
        }
        
        BTreeIterator operator--(int) {
            BTreeIterator temp = *this;
            Decrement();
            return temp;
        }
        
        friend bool operator==(const BTreeIterator& x, const BTreeIterator& y) {
            return x.node == y.node && x.it == y.it;
        }
        
        friend bool operator!=(const BTreeIterator& x, const BTreeIterator& y) {
            return !(x == y);
        }
    };

我的 typedef 声明class BTree

    using iterator = BTreeIterator;
    using const_iterator = BTreeConstIterator;
    using reverse_iterator = std::reverse_iterator<iterator>;
    using const_reverse_iterator = std::reverse_iterator<const_iterator>;

    iterator begin_;
    const_iterator cbegin_;
    iterator end_;
    const_iterator cend_;

// ... 

    reverse_iterator rbegin() {
        return reverse_iterator(end_);
    }
    
    const_reverse_iterator rbegin() const {
        return const_reverse_iterator(cend_);
    }
    
    const_reverse_iterator crbegin() const {
        return const_reverse_iterator(cend_);
    }
    
    reverse_iterator rend() {
        return reverse_iterator(begin_);
    }
    
    const_reverse_iterator rend() const {
        return const_reverse_iterator(cbegin_);
    }
    
    const_reverse_iterator crend() const {
        return const_reverse_iterator(cbegin_);
    }
    

编译器因此抱怨:

error: return-statement with a value, in function returning 'std::reverse_iterator<BTree<int, 2>::BTreeConstIterator>::reference' {aka 'void'}

该标准给出(https://en.cppreference.com/w/cpp/iterator/reverse_iterator):

直到 C++20,std::reverse_iterator<Iter>::reference一直等于std::iterator_traits<Iter>::reference(在我的情况下,T&

自 C++20 以来,std::reverse_iterator<Iter>::reference已更改为 std::iter_reference_t<Iter> = decltype(*std::declval<Iter&>()) It似乎已成为void我的情况,导致错误。

我的问题:

  1. 更改派生反向迭代器的引用类型的基本原理是什么?
  2. 为什么我的BTreeIterator类型不可引用?decltype(*std::declval<BTreeIterator&>())void. 我怎样才能将其更改为T&

标签: c++iteratorlanguage-lawyerc++20

解决方案


推荐阅读