2012-08-10 150 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