C++双向迭代器前缀增量
观察1:C++输出迭代器需要&r == &++r
,而输入迭代器没有提到这个要求。参见[C++ 11:24.2。{3,4}]C++双向迭代器前缀增量
观察2:正向,双向和随机访问迭代器满足输入迭代器要求[24.2。{5,6,7}:1],但不一定是输出迭代器的要求,除非它们是可变的 [24.2.1:4]。观察3:双向迭代器添加前缀递减操作,要求&r == &--r
[24.2.6]。
那么,是不是真的,一个不断双向迭代器必须满足&r == &--r
但不一定&r == &++r
,而可变双向迭代器必须同时满足?
你能解决这个需求如何影响实现吗?
MVG,下面,问这个问题我真正的意思:
- 当它是有意义的不断前进的迭代器不能满足
&r == &++r
?
这是一种间接的方式来制定需求,而没有明确指定特定的实现。尤其是&r == &++r
是一种说法,++r
不能返回代理对象。结果必须是相同的迭代器。
这里mutable
和const
并不完全相反,但是表示可写,并且再次指向输出迭代器的需求。
双向迭代器当然必须支持++p
和--p
(按照定义),但不必是可写/可变的。
这些类别在读/写和向前/向后移动之间并不完全正交,因此各个需求并不像它们本来的那样是独立的。这造成一些混淆。
我不确定您的结论是否来自观察结果,但不认为这是实施的重要*度。事实上,您必须支持诸如*++p
和*p++
这样的设置,才能设置大部分限制。
您能否解释这个要求可能如何影响实施?
显而易见的答案是,一个或operator++()
方法operator--()
必须return *this
,而一个单独的函数Foo& operator++(Foo& arg)
必须返回其参数。由于无论如何这都是一种理智的做法,大多数实现都不必担心。 “
更复杂的问题是”什么时候按照上面的方法对一个(例如正向输入)迭代器而不是有意义“。我还没有拿出一个合理的例子。即使对于一个常量输入迭代器,类型的++r
也必须是对迭代器类型的引用。因此任何形式的“代理对象”,如his answer中提到的@Bo Persson,只有在该代理对象是迭代器类的子类时才有效。似乎没有多大意义。
我有一种感觉,要求&r == &++r
被简单地遗忘了输出迭代器的情况。我怀疑这个规范的作者是否有任何具体的使用案例,不能满足这个要求。但我猜测,所以我期待这个问题更可靠的答案。
感谢更复杂(更有趣)的问题。这真的是我正在做的,所以我在上面添加了它。 – nknight 2012-08-10 21:53:40