簡體   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