【问题标题】: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。我需要实现iterator 和const_iterator,但是一旦我实现了iterator,const_iterator 不仅可以实现为iterator<const T>(其中T 是集合中包含的类型)?
这一定是有原因的,因为在实现iterator 和const_iterator 时有上百万个关于如何重用代码的问题,但没有一个说“只需使用const T 作为类型”。
【问题讨论】:
标签:
c++
iterator
constants
const-iterator
【解决方案1】:
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。因此,这不会成为您在未来标准版本中的建议的问题。