进一步满足输出迭代器要求的迭代器称为可变迭代器.不可变迭代器称为常量迭代器.[24.2.1:4]
这表明你可以有一个可变的输入迭代器,它满足输入和输出迭代器的要求.
在递增输入迭代器之后,其旧值的副本不必是可解除引用的[24.2.3].但是,标准对输出迭代器并没有相同的说法; 实际上,后缀增量的操作语义给出为{ X tmp = r; ++r; return tmp; },表明输出迭代器可能不会使旧迭代器值无效(副本).
那么,可以递增一个可变输入迭代器使旧迭代器副本无效吗?
如果是这样,你将如何支持这样的代码X a(r++); *a = t或X::reference p(*r++); p = t用(例如)代理对象?
如果没有,那为什么boost::iterator声称它需要一个代理对象?(链接是代码;向下滚动以阅读structs 上的注释writable_postfix_increment_proxy和postfix_increment_result).也就是说,如果您可以返回旧迭代器值的(可解除引用的)副本,为什么还需要将此副本包装在代理中?
解释如果在下一节[24.2.5]前向迭代器中找到,其中说明了它们与输入和输出迭代器的区别:
如果出现以下情况,则两个可解除引用的迭代器
a和b类型X提供多次通过保证:-
a == bimplies++a == ++b和
-X是指针类型或表达式(void)++X(a), *a等价于表达式*a.[注意:
a == b暗示的要求++a == ++b(对于输入和输出迭代器不是这样)以及通过可变迭代器(适用于输出迭代器)去除对赋值数量的限制允许使用多遍 -具有前向迭代器的定向算法. - 尾注]
不幸的是,标准必须作为一个整体阅读,并且解释并不总是你期望的.