观察1:C ++输出迭代器需要&r == &++r
,而输入迭代器不提及此要求。见[C ++ 11:24.2。{3,4}]
观察2:正向,双向和随机访问迭代器满足输入迭代器要求[24.2。{5,6,7}:1],但不一定是输出迭代器要求,除非它们可变 [24.2.1:4]。
观察3:双向迭代器添加前缀减量操作,需求为&r == &--r
[24.2.6]。
那么,常量双向迭代器必须满足&r == &--r
但不一定是&r == &++r
,而可变双向迭代器必须满足既?
您能否说明此要求可能会如何影响实施?
下面的MvG,问我真正想要的问题:
&r == &++r
?答案 0 :(得分:1)
这是制定需求的间接方式,没有明确指定特定实现。特别是&r == &++r
是一种说++r
无法返回代理对象的方式。结果必须是相同的迭代器。
这里mutable
与通常方式的const
不完全相反,但意味着可写,并且再次引用输出迭代器的要求。
双向迭代器当然必须同时支持++p
和--p
(根据定义),但不必是可写/可变的。
类别在读/写和向前/向后移动之间并不是完全正交的,因此个别要求不是独立的,因为它们本来可以。这会引起一些混乱。
我不确定你的结论是否来自观察结果,但不认为它是实施的重要自由。您必须支持*++p
和*p++
等内容的事实设置了大部分限制。
答案 1 :(得分:1)
您能否说明此要求可能会如何影响实施?
显而易见的答案是,operator++()
或operator--()
方法必须return *this
,而单独的函数Foo& operator++(Foo& arg)
必须返回其参数。因为在任何情况下这都是理智的事情,大多数实现都不必担心。
更复杂的问题是“什么时候(<正向输入)迭代器对而不是遵循上述方法有意义”。我还没有想出一个合理的例子。即使对于常量输入迭代器,++r
的类型也必须是对迭代器类型的引用。因此,任何形式的“代理对象”,如his answer中提到的@Bo Persson,只有在代理对象是迭代器类的子类时才有效。似乎没有多大意义。
我觉得输出迭代器案例只是忘记了请求&r == &++r
。我怀疑规范的作者是否有任何具体的用例,这些要求无法满足。但我猜,所以我期待对这个问题有一个更可靠的答案。