什么时候将 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;
例如,我可以用类似于以下的方式定义容器:
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;