【发布时间】:2012-08-09 08:53:30
【问题描述】:
进一步满足输出迭代器要求的迭代器称为可变迭代器。不可变迭代器被称为常量迭代器。 [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 上的 cmets)。也就是说,如果您可以返回旧迭代器值的(可取消引用)副本,为什么需要将此副本包装在代理中?
【问题讨论】:
-
哦,我多么讨厌这些语言律师问题。还不如争论有多少天使在针头上跳舞。
-
@MarkRansom 是的,我确实讨厌人们试图理解他们使用的语言。该死的……我需要在 this 评论中告诉全世界我对他们的仇恨(为了记录,迭代器类别在 C++ 中很重要。了解它们中的每一个可以做的非常有用)
-
@MarkRansom:我的问题对我来说很重要,因为肯定的答案意味着我必须向我的类添加另一个代理对象来处理可变输入迭代器,就像 Boost 一样。下面的共识表明不存在可变输入迭代器之类的东西(尽管 24.2.1:4 中有注释)。这反过来表明 Boost 在处理“可变输入迭代器”时是不正确的 --- 如果即使 Boost 开发人员也误解了标准的这一方面,这难道不是一个应该解决的问题吗?
-
@nknight,我在深夜写了我的评论,它肯定比它需要的更讽刺。我写这篇文章是因为无法想象一个答案很重要的情况,即使我知道这个问题更有可能是我的想象力而不是问题。感谢您提供更多背景信息,请原谅我如此粗鲁。