2012-08-10 144 views
3

观察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

回答

1

这是一种间接的方式来制定需求,而没有明确指定特定的实现。尤其是&r == &++r是一种说法,++r不能返回代理对象。结果必须是相同的迭代器。

这里mutableconst并不完全相反,但是表示可写,并且再次指向输出迭代器的需求。

双向迭代器当然必须支持++p--p(按照定义),但不必是可写/可变的。

这些类别在读/写和向前/向后移动之间并不完全正交,因此各个需求并不像它们本来的那样是独立的。这造成一些混淆。

我不确定您的结论是否来自观察结果,但不认为这是实施的重要自由度。事实上,您必须支持诸如*++p*p++这样的设置,才能设置大部分限制。

1

您能否解释这个要求可能如何影响实施?

显而易见的答案是,一个或operator++()方法operator--()必须return *this,而一个单独的函数Foo& operator++(Foo& arg)必须返回其参数。由于无论如何这都是一种理智的做法,大多数实现都不必担心。 “

更复杂的问题是”什么时候按照上面的方法对一个(例如正向输入)迭代器而不是有意义“。我还没有拿出一个合理的例子。即使对于一个常量输入迭代器,类型++r也必须是对迭代器类型的引用。因此任何形式的“代理对象”,如his answer中提到的@Bo Persson,只有在该代理对象是迭代器类的子类时才有效。似乎没有多大意义。

我有一种感觉,要求&r == &++r被简单地遗忘了输出迭代器的情况。我怀疑这个规范的作者是否有任何具体的使用案例,不能满足这个要求。但我猜测,所以我期待这个问题更可靠的答案。

+0

感谢更复杂(更有趣)的问题。这真的是我正在做的,所以我在上面添加了它。 – nknight 2012-08-10 21:53:40