递增一个可变输入迭代器会使旧迭代器值无效吗?

nkn*_*ght 9 c++ iterator

进一步满足输出迭代器要求的迭代器称为可变迭代器.不可变迭代器称为常量迭代器.[24.2.1:4]

这表明你可以有一个可变的输入迭代器,它满足输入和输出迭代器的要求.

在递增输入迭代器之后,其旧值的副本不必是可解除引用的[24.2.3].但是,标准对输出迭代器并没有相同的说法; 实际上,后缀增量的操作语义给出为{ X tmp = r; ++r; return tmp; },表明输出迭代器可能不会使旧迭代器值无效(副本).

那么,可以递增一个可变输入迭代器使旧迭代器副本无效吗?

如果是这样,你将如何支持这样的代码X a(r++); *a = tX::reference p(*r++); p = t用(例如)代理对象?

如果没有,那为什么boost::iterator声称它需要一个代理对象?(链接是代码;向下滚动以阅读structs 上的注释writable_postfix_increment_proxypostfix_increment_result).也就是说,如果您可以返回旧迭代器值的(可解除引用的)副本,为什么还需要将此副本包装在代理中?

Bo *_*son 6

解释如果在下一节[24.2.5]前向迭代器中找到,其中说明了它们与输入和输出迭代器的区别:

如果出现以下情况,则两个可解除引用的迭代器ab类型X提供多次通过保证:

- a == bimplies ++a == ++b
- X是指针类型或表达式(void)++X(a), *a等价于表达式*a.

[注意:a == b暗示的要求++a == ++b(对于输入和输出迭代器不是这样)以及通过可变迭代器(适用于输出迭代器)去除对赋值数量的限制允许使用多遍 -具有前向迭代器的定向算法. - 尾注]

不幸的是,标准必须作为一个整体阅读,并且解释并不总是你期望的.

  • 不,我是说前进迭代器需要做你想要的,输入迭代器不是.标准之间没有任何内容.即使你有*some*of forward迭代器的属性,它仍然是输入或输出迭代器,直到*all*requirements完全填满.考虑输入迭代器可以连接到键盘.即使您保存了它的副本,也无法备份并让我重新键入文本.类似于输出迭代器,它可以直接进入打印机. (2认同)
  • 哦! 我将保存键盘/打印机类比以备将来重用:D (2认同)
  • @nknight输入迭代器和前向迭代器之间没有标准.您当然可以编写适合您的内容,但它不符合标准的迭代器类别.已经提出了更精细的分类,以及遍历与访问对象的方式的分离.然而,没有任何结果,这影响了标准. (2认同)