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

MFH*_*MFH 10 c++ iterator-traits

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

Jos*_*eld 13

在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 { };
}
Run Code Online (Sandbox Code Playgroud)

如你所见,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.