const_iterator<T>和iterator<const T>有什么区别?

8
假设我正在实现一个集合,比如像 std::vector 这样的东西。我需要实现 iteratorconst_iterator,但一旦我已经实现了 iterator,是否可以将 const_iterator 实现为 iterator<const T>(其中 T 是集合中包含的类型)?
肯定有某些原因不能这样做,因为有无数个关于如何在实现 iteratorconst_iterator 时重用代码的问题,但没有一个问题说“只需使用 const T 作为类型” 。
1个回答

4

std::iterator_traits<Iter>::value_type应该对于const_iterator<T>T,但对于iterator<const T>const T1。如果您将iterator<const T>用作const_iterator<T>,则必须违反其中一个假设。

只要值类型的constness是与迭代器的constness不同的模板参数, 就可以为两个迭代器使用共同的模板。例如:

template<class T>
struct container
{
    template<class ItPtr>
    struct iterator_common
    {
        using value_type = T;
        using pointer = ItPtr;
        using reference = std::remove_pointer_t<ItPtr>&;
        // ...
    };

    using iterator = iterator_common<T*>;
    using const_iterator = iterator_common<const T*>;
    // ...
};

1 在 C++20 之前,应该使用 std::remove_cv_t<const T> 来代替 T。因此,在未来的标准版本中,你的建议将不会成为问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接