![](/img/trans.png)
[英]no type named ‘pointer’ in struct std::iterator_traits<…>
[英]What is the use of the nested pointer type in iterator_traits?
std::iterator_traits
類模板定義了5種嵌套類型: iterator_category
, value_type
, difference_type
, pointer
和reference
。 瀏覽libc ++和libstdc ++的<algorithm>
標頭的源代碼,可以看到value_type
, difference_type
和iterator_category
許多用法,但只有一個用於reference
(在std::iter_swap
)而沒有用於pointer
。
我的應用程序使用手工構建的代理迭代器/代理引用對。 我想轉換到使用Boost iterator_facade
,它允許我將引用類型從默認的T&
配置為任意類型,但對於默認情況下為T*
的指針類型則不然。 我想避免被嵌套pointer
類型的一些深度隱藏使用所困擾。
注意 :迭代器是沒有嵌套成員的內置類型的代理,因此我不需要與operator->
兼容(返回類型將是pointer
)。
問題 :標准庫中有哪些用例用於iterator_traits
的嵌套類型pointer
?
與此相反的前三種類型iterator_category
, value_type
和difference_type
(其大量使用標准算法用於tag分派到取決於迭代器功能有效的版本)中的最后兩個類型的pointer
並且reference
內部iterator_traits
出現不被任何算法中使用但用於定義符合迭代器要求。
24.2.1一般[iterator.requirements.general]
1 [..]表達式
(*i).m
被很好地定義的所有迭代器i
支持表達式i->m
,其語義與(*i).m
。 [...]
24.4.1迭代器特征[iterator.traits]
[...]此外,類型
iterator_traits<Iterator>::reference iterator_traits<Iterator>::pointer
應德音響定義為迭代器的基准和指針類型,即,用於迭代器對象
a
,類型相同的類型*a
和a->
分別。 [...]
pointer
和reference
的默認值T*
和T&
當然滿足迭代器要求。 關於代理引用, Boost.Iterator文檔指定
可讀迭代器(以及今天的輸入迭代器)的
reference
類型實際上不必是引用,只要它可以轉換為迭代器的value_type
。 但是,當value_type
是一個類時,仍然可以通過operator->
訪問成員。 因此,其reference
類型實際上不是reference
的迭代器必須從其operator->
返回包含引用值的副本的代理。未明確指定
iterator_facade
的operator->
和operator[]
的返回類型。 相反,這些類型是根據一組需求來描述的,這些需求必須由iterator_facade
實現來滿足。
結論 :只要代理迭代器不需要通過.m
或->m
訪問其底層value_type
成員,就不需要擔心iterator_traits
的pointer
類型,即使使用代理迭代器,也需要boost::iterator_facade
會做正確的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.