簡體   English   中英

iterator_traits中嵌套指針類型的用途是什么?

[英]What is the use of the nested pointer type in iterator_traits?

std::iterator_traits類模板定義了5種嵌套類型: iterator_categoryvalue_typedifference_typepointerreference 瀏覽libc ++和libstdc ++的<algorithm>標頭的源代碼,可以看到value_typedifference_typeiterator_category許多用法,但只有一個用於reference (在std::iter_swap )而沒有用於pointer

我的應用程序使用手工構建的代理迭代器/代理引用對。 我想轉換到使用Boost iterator_facade ,它允許我將引用類型從默認的T&配置為任意類型,但對於默認情況下為T*的指針類型則不然。 我想避免被嵌套pointer類型的一些深度隱藏使用所困擾。

注意 :迭代器是沒有嵌套成員的內置類型的代理,因此我不需要與operator->兼容(返回類型將是pointer )。

問題 :標准庫中有哪些用例用於iterator_traits的嵌套類型pointer

與此相反的前三種類型iterator_categoryvalue_typedifference_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 ,類型相同的類型*aa->分別。 [...]

pointerreference的默認值T*T&當然滿足迭代器要求。 關於代理引用, Boost.Iterator文檔指定

可讀迭代器(以及今天的輸入迭代器)的reference類型實際上不必是引用,只要它可以轉換為迭代器的value_type 但是,當value_type是一個類時,仍然可以通過operator->訪問成員。 因此,其reference類型實際上不是reference的迭代器必須從其operator->返回包含引用值的副本的代理。

未明確指定iterator_facadeoperator->operator[]的返回類型。 相反,這些類型是根據一組需求來描述的,這些需求必須由iterator_facade實現來滿足。

結論 :只要代理迭代器不需要通過.m->m訪問其底層value_type成員,就不需要擔心iterator_traitspointer類型,即使使用代理迭代器,也需要boost::iterator_facade會做正確的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM