繁体   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