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

Ald*_*enB 1 c++ iterator class const-iterator

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

template <typename T>
class Example
{
public:
    using value_type = T;
    using iterator = value_type*;
    using const_iterator = const iterator;
    //etc
};
Run Code Online (Sandbox Code Playgroud)

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

template<typename T>
class Example
{
public:
    using value_type = T;
    /*friend?*/ class iterator;
    using const_iterator = const iterator; //is this okay?
    //etc
};
Run Code Online (Sandbox Code Playgroud)

详细的解释将不胜感激。

jua*_*nza 5

Aconst_iterator和aconst iterator代表两种不同的事物。在每种情况下, 都const适用于不同的东西:在第一种情况下是迭代器“指向”的对象,在第二种情况下是迭代器本身。因此,将一者用于另一者永远是不够的。

用指针来说(指针是迭代器),这就是“指向 const 的指针”和“const 指针”之间的区别。

const int* it; // pointer to const int: a const_iterator
int* it const; // const pointer to int: a const iterator
Run Code Online (Sandbox Code Playgroud)

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

const int* it const;
Run Code Online (Sandbox Code Playgroud)