2012-12-27 73 views
7

是否需要ForwardIterators作为OutputIterators?我目前的STL实现(VS2012)从input_iterator_tagoutput_iterator_tag中派生出forward_iterator_tag,但我在标准[N3485]中找不到这个要求。正向迭代器是输出迭代器吗?

回答

11

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

一个类或指针类型X满足正向迭代如果满足要求:

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

事实上,前向迭代符合输出迭代器的要求,只有当它是一个可变迭代到sequen可复制指定类型的文件夹

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

更关键的是,迭代器标签是由标准为(§24.4.3/ 2)具体定义:

正如你可以看到,forward_iterator_tag应该只从input_iterator_tag继承。


在C++ 03,更说明正向迭代满足输入和输出的迭代器的要求:

正向迭代满足输入和输出迭代的所有要求,并且可以使用无论何时指定。

但这然后在下面的段落矛盾,指出一个不断前进的迭代器将不能满足输出迭代器的要求:

而且其类别,向前,双向或随机访问迭代器也可以是可变的或常量,取决于表达式* i的结果是作为参考还是作为常数的参考。常数迭代器不满足输出迭代器的要求,并且表达式* i(对于常量迭代器i)的结果不能用于需要左值的表达式中。

但是,迭代器标签的定义与C++ 11中的定义相同。有一个defect report这个矛盾的措辞,但它被关闭作为不是一个缺陷,因为第一个报价是在该部分的“介绍文本”,并可能在未来重写(它是)。


SGI definition of a forward iterator被给定为输入和输出迭代的细化(感谢评价@BenVoigt)。

尽管如此,如果我们看看implementation of the iterator tags,我们发现forward_iterator_tag仍然只从input_iterator_tag继承。

看起来这已经相当多,在过去混乱的区域,但如果VS2012被定义为forward_iterator_tag来自output_继承 - 和input_iterator_tag,我只能假设这是一个错误。

+0

但请注意,这似乎与SGI定义不同,文档中提到ForwardIterator是“InputIterator和OutputIterator的一种改进”,即存在ForwardInputIterator和ForwardOutputIterator,但不仅仅是ForwardIterator,这个概念不能单独存在。 –

+0

@BenVoigt看来,这改变了C++ 03和C++ 11之间。编辑:等等,实际上,它很混乱。 –

+0

@sftrabbit:感谢您解决这个问题。现在什么是将迭代器标记为向前和输出的规范方法? (简单地介绍一个新的私有标签,从两个继承,还是有不同的方式?) – MFH