什么时候将 const_iterator 声明为 const 迭代器就足够了?

When is it sufficient to declare const_iterator as a const iterator?

例如,我可以用类似于以下的方式定义容器:

template <typename T>
class Example
{
public:
    using value_type = T;
    using iterator = value_type*;
    using const_iterator = const iterator;
    //etc
};

但是,可以使用用户定义的迭代器执行此操作吗?

template<typename T>
class Example
{
public:
    using value_type = T;
    /*friend?*/ class iterator;
    using const_iterator = const iterator; //is this okay?
    //etc
};

如有详细说明,将不胜感激。

一个const_iterator和一个const iterator代表两个不同的东西。在每种情况下,const 适用于不同的东西:第一种情况下迭代器的对象 "pointed to",第二种情况下迭代器本身。因此,永远不会 "sufficient" 以一为二。

用指针说话(指针是迭代器),这就是 "pointer to const" 和 "const pointer" 之间的区别。

const int* it; // pointer to const int: a const_iterator
int* it const; // const pointer to int: a const iterator

您甚至可以将 const 迭代器设置为 const,或者 const const_iterator:

const int* it const;