3

观察 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 提出了我真正想说的问题:

  • 常量 Forward 迭代器什么时候不满足&r == &++r
4

2 回答 2

1

你能解决这个要求如何影响实现吗?

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

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

我有一种感觉,&r == &++r对于输出迭代器的情况,要求只是被遗忘了。我怀疑该规范的作者是否有任何特定的用例无法满足此要求。但我猜,所以我期待这个问题的更可靠的答案。

于 2012-08-10T21:22:29.037 回答
1

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

这里与通常的方式mutable并不完全相反const,而是意味着可写,并且再次指代输出迭代器的要求。

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

这些类别在读/写和向前/向后可移动之间并不完全正交,因此各个需求并不是独立的,因为它们本来可以是独立的。这会引起一些混乱。

我不确定您的结论是否来自观察结果,但不认为这将是实施的重要自由。事实上,你必须支持类似的东西 *++p*p++设置大部分限制。

于 2012-08-10T21:02:02.370 回答