Spaceship (<=>) operator with iterator implementation results in error: '+' cannot add two pointers

Spaceship (<=>) operator with iterator implementation results in error: '+' cannot add two pointers

这就是我所有的,当然还有典型的 class 的其余部分,带有构造函数、析构函数等。但是,Visual Studio 2022 中的 C++ 编译器给我这个错误:

CS2110 '+' cannot add two pointers.

考虑到我在此 class 中的私人声明,这是有道理的。但是,我不确定如何正确解决这个问题?在我的其他实现中,实际大小不是 pointer,而是类型 size_tsize,这非常有效很好。

私有变量:

T* m_ptr;
size_t* m_counter;

迭代代码:

// Implemented C++ 11 range-based support.
iterator begin() noexcept { return m_ptr; }
iterator end() noexcept { return (m_ptr + m_counter); }
const_iterator begin() const noexcept { return const_iterator(m_ptr); }
const_iterator end() const noexcept { return const_iterator(m_ptr + m_counter); }

宇宙飞船(<=>)操作员代码:

friend auto operator<=>(const SharedPtr& lhs, const SharedPtr& rhs) 
    {
        auto left = lhs.begin();
        auto right = rhs.begin();

        for (; left != lhs.end() && right != rhs.end(); ++left, ++right) {
            if (*left < *right)
                return std::strong_ordering::less;
            if (*left > *right)
                return std::strong_ordering::greater;
        }

        if (left == lhs.end())
            if (right == rhs.end())
                return std::strong_ordering::equivalent;
            else
                return std::strong_ordering::less;
        else
            return std::strong_ordering::greater;
    }
CS2110 '+' cannot add two pointers.
T* m_ptr;
size_t* m_counter;
iterator end() noexcept { return (m_ptr + m_counter); }
//                                      ^
const_iterator end() const noexcept { return const_iterator(m_ptr + m_counter); }
//                                                                ^

错误在这里。您正试图添加两个指针。指针不能相加;这是一个无意义的操作,程序是ill-formed.

operator<=> 除了调用损坏的 end 函数外,与此错误在其他方面无关。

However, I am not sure, how this can be resolve properly

这取决于您要做什么。这取决于m_ptrm_counter分别指向什么。

如果 m_ptr指向一个数组元素, m_counter指向一个整数表示数组中连续元素的数量,你的目标是得到一个超过元素数量的指针,然后你可以通过m_counter指针间接获取大小,并将其添加到 m_ptr:

iterator end() noexcept { return m_ptr + *m_counter; }

但这提出了一个新问题:为什么 m_counter 是一个指针?为什么数组的大小不是按值存储的?

m_counter it is the reference counter.

如果 m_counter 不是 m_ptr 指向的元素的连续元素数,那么上面的添加没有意义,可能会导致未定义的行为。在这种情况下,请不要这样做。