![](/img/trans.png)
[英]Converting vector<>::const_iterator to vector<>::iterator
[英]How vector iterator's copy-constructor use SFINAE to allow for iterator to const_iterator conversion?
在研究各种std::vector
的迭代器实现时,我注意到这个复制构造函数使用 SFINAE 允许从非常量迭代器初始化常量迭代器,反之亦然:
// Allow iterator to const_iterator conversion
// ...
// N.B. _Container::pointer is not actually in container requirements,
// but is present in std::vector and std::basic_string.
template<typename _Iter>
__normal_iterator(const __normal_iterator<_Iter,
typename __enable_if<
(std::__are_same<_Iter, typename _Container::pointer>::__value),
_Container>::__type>& __i) : _M_current(__i.base()) { }
众所周知,向量的迭代器是这样定义的:
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
const_iterator;
我不明白根据Iter
检查容器的pointer
类型如何允许转换。 如果我传递一个常量迭代器, Iter
应该是const_pointer
,这不会使enable_if<>
检查失败并从集合中丢弃这个构造函数吗? 那会用哪一个呢?
您能否解释一下这个构造函数是如何工作的,并可能举一个这种替换的例子?
PS 另一个问题是为什么std::list
不使用相同的技术来通过声明这样的迭代器来避免代码重复。 对于两个版本的迭代器,它都有两个单独的类。 我想知道是否有可能以与向量相同的方式实现列表的迭代器
如果我传递一个常量迭代器,Iter 应该是 const_pointer,这不会使 enable_if<> 检查失败并从集合中丢弃这个构造函数吗? 那会用哪一个呢?
是的,这正是发生的事情,因为该定义将是默认(隐式)复制构造函数的模棱两可的重载。 这些额外的构造函数允许隐式转换仅从非 const 到 const 迭代器,以及从类指针类型到迭代器的显式转换。
至于std::list
,我不知道,它可能只是一个任意的实现细节。 或者也许这种方式被认为更具可读性/可维护性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.