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
)。
问题:标准库中pointer
内的嵌套类型iterator_traits
有哪些用例?
答案 0 :(得分:4)
与前三种类型iterator_category
,value_type
和difference_type
(标准算法大量使用,用于根据迭代器功能将标签分派到高效版本)进行对比pointer
内的reference
和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
, 与*a
和a->
的类型相同的类型。 [...]
T*
和T&
的默认值pointer
和reference
当然满足迭代器要求。关于代理引用,Boost.Iterator documentation指定
可读迭代器的
reference
类型(以及今天的输入迭代器) 实际上不需要作为参考,只要它可以转换为 迭代器的value_type
。但是,当value_type
是一个类时,它 必须仍然可以通过operator->
访问成员。 因此,reference
类型实际上不是引用的迭代器 必须返回包含其引用值的副本的代理operator->
。
iterator_facade
的{{1}}和operator->
的返回类型是 未明确指定。相反,这些类型用术语来描述 一系列要求,必须满足operator[]
实施。
结论:只要代理迭代器不需要访问其基础iterator_facade
到value_type
或.m
的成员,就不必担心关于->m
内的pointer
类型,即使有人使用代理迭代器,iterator_traits
也会做正确的事。