7

std::iterator_traits模板定义了 5 种嵌套类型:iterator_categoryvalue_typedifference_type和. 浏览libc++ 和 libstdc++ 头文件的来源,可以看到 , 和 的许多用途,但只有一种用于(inside ) 而没有用于.pointerreference<algorithm>value_typedifference_typeiterator_categoryreferencestd::iter_swappointer

我的应用程序使用手动构建的代理迭代器/代理引用对。我想过渡到使用 Boost iterator_facade,它可以让我将引用类型从默认配置T&为任意类型,但对于T*默认的指针类型则不然。pointer我想避免被嵌套类型的一些深藏不露的使用所困扰。

注意:迭代器是没有嵌套成员的内置类型的代理,所以我不需要兼容operator->(返回类型为pointer)。

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

4

1 回答 1

5

与前三种类型相比iterator_categoryvalue_typedifference_type (标准算法大量使用它们根据迭代器功能将标签分派到有效版本)后两种类型pointerreference内部iterator_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&for当然满足迭代器要求pointerreference关于代理引用,Boost.Iterator 文档指定

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

iterator_facade'soperator->和的返回类型operator[]没有明确指定。相反,这些类型是根据一组要求来描述的,这些要求必须由 iterator_facade实现来满足。

结论:只要代理迭代器不需要value_type通过.mor访问其底层成员->m,就不需要担心pointer里面的类型iterator_traits,即使确实使用代理迭代器,boost::iterator_facade也会做正确的事情。

于 2014-02-17T11:59:15.697 回答