2012-12-27 121 views
7

是否需要ForwardIterators作爲OutputIterators?我目前的STL實現(VS2012)從input_iterator_tagoutput_iterator_tag中派生出forward_iterator_tag,但我在標準[N3485]中找不到這個要求。正向迭代器是輸出迭代器嗎?

回答

11

在C++ 11中,不需要前向迭代器是輸出迭代器。輸出迭代器需求就像迭代器可以擁有的一組額外需求,而不管其滿足的迭代器需求的其餘部分。前向迭代只需要輸入迭代器(§24.2.5/ 1):

一個類或指針類型X滿足正向迭代如果滿足要求:

  • X滿足的要求一個輸入迭代
  • ...

事實上,前向迭代符合輸出迭代器的要求,只有當它是一個可變迭代到sequen可複製指定類型的文件夾

†或一個常量迭代器到一個類型序列,其中operator=(...) const定義爲可變成員。

更關鍵的是,迭代器標籤是由標準爲(§24.4.3/ 2)具體定義:

正如你可以看到,forward_iterator_tag應該只從input_iterator_tag繼承。


在C++ 03,更說明正向迭代滿足輸入和輸出的迭代器的要求:

正向迭代滿足輸入和輸出迭代的所有要求,並且可以使用無論何時指定。

但這然後在下面的段落矛盾,指出一個不斷前進的迭代器將不能滿足輸出迭代器的要求:

而且其類別,向前,雙向或隨機訪問迭代器也可以是可變的或常量,取決於表達式* i的結果是作爲參考還是作爲常數的參考。常數迭代器不滿足輸出迭代器的要求,並且表達式* i(對於常量迭代器i)的結果不能用於需要左值的表達式中。

但是,迭代器標籤的定義與C++ 11中的定義相同。有一個defect report這個矛盾的措辭,但它被關閉作爲不是一個缺陷,因爲第一個報價是在該部分的「介紹文本」,並可能在未來重寫(它是)。


SGI definition of a forward iterator被給定爲輸入和輸出迭代的細化(感謝評價@BenVoigt)。

儘管如此,如果我們看看implementation of the iterator tags,我們發現forward_iterator_tag仍然只從input_iterator_tag繼承。

看起來這已經相當多,在過去混亂的區域,但如果VS2012被定義爲forward_iterator_tag來自output_繼承 - 和input_iterator_tag,我只能假設這是一個錯誤。

+0

但請注意,這似乎與SGI定義不同,文檔中提到ForwardIterator是「InputIterator和OutputIterator的一種改進」,即存在ForwardInputIterator和ForwardOutputIterator,但不僅僅是ForwardIterator,這個概念不能單獨存在。 –

+0

@BenVoigt看來,這改變了C++ 03和C++ 11之間。編輯:等等,實際上,它很混亂。 –

+0

@sftrabbit:感謝您解決這個問題。現在什麼是將迭代器標記爲向前和輸出的規範方法? (簡單地介紹一個新的私有標籤,從兩個繼承,還是有不同的方式?) – MFH