【问题标题】:What's the difference between const_iterator<T> and iterator<const T>?const_iterator<T> 和 iterator<const T> 有什么区别?
【发布时间】:2019-10-30 14:24:37
【问题描述】:

假设我正在实现一个集合,比如std::vector。我需要实现iteratorconst_iterator,但是一旦我实现了iteratorconst_iterator 不仅可以实现为iterator&lt;const T&gt;(其中T 是集合中包含的类型)?

这一定是有原因的,因为在实现iteratorconst_iterator 时有上百万个关于如何重用代码的问题,但没有一个说“只需使用const T 作为类型”。

【问题讨论】:

    标签: c++ iterator constants const-iterator


    【解决方案1】:

    std::iterator_traits&lt;Iter&gt;::value_type 对于const_iterator&lt;T&gt; 应该是T,但对于iterator&lt;const T&gt; 应该是const T1。如果您将iterator&lt;const T&gt; 用作const_iterator&lt;T&gt;,则必须违反这些假设之一。

    只要值类型的 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&lt;const T&gt;,即 T。因此,这不会成为您在未来标准版本中的建议的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-02
      • 2019-09-04
      • 2012-03-10
      • 1970-01-01
      • 2012-03-29
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多