![](/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.