繁体   English   中英

前向迭代器是输出迭代器吗?

[英]Are Forward-Iterators Output-Iterators?

ForwardIterators是否必须是OutputIterators? 我当前的STL实现(VS2012)从input_iterator_tagoutput_iterator_tag派生出forward_iterator_tag ,但我在标准[N3485]中找不到这个要求。

在C ++ 11中,没有,前向迭代器不需要输出迭代器。 输出迭代器要求就像迭代器可以拥有的一组额外要求,而不管它遇到的其余迭代器要求。 前向迭代器只需要是输入迭代器(§24.2.5/ 1):

在以下情况下,类或指针类型X满足前向迭代器的要求:

  • X满足输入迭代器的要求
  • ...

事实上,只有当前向迭代器是一系列可复制赋值类型的可变迭代器†时,它才符合输出迭代器的要求。

†或类型序列的常量迭代器,其中operator=(...) const由可变成员定义。

更重要的是,迭代器标签由标准专门定义为(§24.4.3/ 2):

namespace std {
  struct input_iterator_tag { };
  struct output_iterator_tag { };
  struct forward_iterator_tag: public input_iterator_tag { };
  struct bidirectional_iterator_tag: public forward_iterator_tag { };
  struct random_access_iterator_tag: public bidirectional_iterator_tag { };
}

如您所见, forward_iterator_tag应仅从input_iterator_tag继承。


在C ++ 03中,声明前向迭代器满足输入和输出迭代器的要求:

前向迭代器满足输入和输出迭代器的所有要求,并且只要指定了任何一种类型,就可以使用它。

但是这在下面的段落中是矛盾的,声明一个常量的前向迭代器不能满足输出迭代器的要求:

除了它的类别之外,正向,双向或随机访问迭代器也可以是可变的或常量的,这取决于表达式* i的结果是作为引用还是作为对常量的引用。 常量迭代器不满足输出迭代器的要求,并且表达式* i(对于常量迭代器i)的结果不能在需要左值的表达式中使用。

但是,迭代器标记的定义与C ++ 11中的相同。 这个矛盾的措辞有一个缺陷报告 ,但它被关闭为非缺陷,因为第一个引用是在该部分的“介绍性文本”中,并且将来可能会被重新编写(它是)。


前向迭代器SGI定义是作为输入和输出迭代器的细化而给出的(感谢评论中的@BenVoigt)。

尽管如此,如果我们看一下迭代器标记实现 ,我们发现forward_iterator_tag仍然只从input_iterator_tag继承。

看起来这在过去是一个相当混乱的领域,但如果VS2012将forward_iterator_tag定义为继承output_ - 和input_iterator_tag ,我只能假设它是一个bug。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM