iterator_traits中嵌套指针类型的用途是什么?

时间:2014-02-17 10:13:46

标签: c++ iterator traits proxy-classes boost-iterators

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 )。

问题:标准库中pointer内的嵌套类型iterator_traits有哪些用例?

1 个答案:

答案 0 :(得分:4)

与前三种类型iterator_categoryvalue_typedifference_type(标准算法大量使用,用于根据迭代器功能将标签分派到高效版本)进行对比pointer内的referenceiterator_traits两种类型似乎不被任何算法使用,但用于定义迭代器要求的符合性。

24.2.1一般[iterator.requirements.general]

  

1 [..]表达式为i的所有迭代器(*i).m   定义良好,支持表达式i->m具有相同的语义   (*i).m。 [...]

24.4.1迭代器特征[iterator.traits]

  

[...]   另外,类型

 iterator_traits<Iterator>::reference
 iterator_traits<Iterator>::pointer 
     

应定义为迭代器   引用和指针类型,即迭代器对象a,   与*aa->的类型相同的类型。 [...]

T*T&的默认值pointerreference当然满足迭代器要求。关于代理引用,Boost.Iterator documentation指定

  

可读迭代器的reference类型(以及今天的输入迭代器)   实际上不需要作为参考,只要它可以转换为   迭代器的value_type。但是,当value_type是一个类时,它   必须仍然可以通过operator->访问成员。   因此,reference类型实际上不是引用的迭代器   必须返回包含其引用值的副本的代理   operator->

     

iterator_facade的{​​{1}}和operator->的返回类型是   未明确指定。相反,这些类型用术语来描述   一系列要求,必须满足   operator[]实施。

结论:只要代理迭代器不需要访问其基础iterator_facadevalue_type.m的成员,就不必担心关于->m内的pointer类型,即使有人使用代理迭代器,iterator_traits也会做正确的事。