MFH*_*MFH 10 c++ iterator-traits
ForwardIterators是否必须是OutputIterators?我现在的STL的实现(VS2012)派生forward_iterator_tag从两个input_iterator_tag和output_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.
| 归档时间: |
|
| 查看次数: |
414 次 |
| 最近记录: |