繁体   English   中英

矢量迭代器的复制构造函数如何使用 SFINAE 允许迭代器到 const_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM