[英]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.