gpt4 book ai didi

c++ - 前向迭代器是输出迭代器吗?

转载 作者:可可西里 更新时间:2023-11-01 15:53:42 27 4
gpt4 key购买 nike

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

最佳答案

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

A class or pointer type X satisfies the requirements of a forward iterator if:

  • X satisfies the requirements of an input iterator
  • ...

事实上,仅当前向迭代器是可复制分配类型序列的可变迭代器时,它才满足输出迭代器要求

† 或类型序列的常量迭代器,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中,声明前向迭代器满足输入和输出迭代器的要求:

Forward iterators satisfy all the requirements of the input and output iterators and can be used whenever either kind is specified.

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

Besides its category, a forward, bidirectional, or random access iterator can also be mutable or constant depending on whether the result of the expression *i behaves as a reference or as a reference to a constant. Constant iterators do not satisfy the requirements for output iterators, and the result of the expression *i (for constant iterator i) cannot be used in an expression where an lvalue is required.

但是,迭代器标记的定义与 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,我只能假设这是一个错误。

关于c++ - 前向迭代器是输出迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14058642/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com