是否需要ForwardIterators作爲OutputIterators?我目前的STL實現(VS2012)從input_iterator_tag
和output_iterator_tag
中派生出forward_iterator_tag
,但我在標準[N3485]中找不到這個要求。正向迭代器是輸出迭代器嗎?
回答
在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
,我只能假設這是一個錯誤。
- 1. 輸入迭代器+輸出迭代器+ X =前向迭代器
- 2. 輸出迭代器的VALUE_TYPE
- 3. 迭代器的迭代器
- 4. 迭代器只能迭代一次嗎?
- 5. 向量迭代器
- 6. 分享迭代器是否可迭代?
- 7. 迭代器的類型:輸出與輸入與正向與隨機訪問迭代器
- 8. 通過python中的xmltree迭代器迭代時的空輸出
- 9. 輸入和輸出迭代器
- 10. 定義正向輸出迭代器的規範方法
- 11. C++ - 迭代器迭代器不編譯
- 12. 異類迭代器的C++迭代器
- 13. Python迭代器:重置迭代器?
- 14. PHP迭代器像mysql迭代器?
- 15. 迭代器錯誤內的向量迭代器
- 16. 正向和當前迭代器
- 17. 輸入迭代器和只讀前向迭代器之間有什麼區別?
- 18. 向量迭代器錯誤
- 19. QValueList逆向迭代器
- 20. JSP Struts反向迭代器
- 21. C++向量的迭代器
- 22. 雙向迭代器Next
- 23. 向量迭代器比較
- 24. 無法複製到輸出迭代器
- 25. 定義迭代器/迭代器構造函數時出錯?
- 26. 在Rust中,是一個迭代器嗎?
- 27. 迭代器postgreslql
- 28. 迭代器類
- 29. Java:迭代器
- 30. C++迭代器
但請注意,這似乎與SGI定義不同,文檔中提到ForwardIterator是「InputIterator和OutputIterator的一種改進」,即存在ForwardInputIterator和ForwardOutputIterator,但不僅僅是ForwardIterator,這個概念不能單獨存在。 –
@BenVoigt看來,這改變了C++ 03和C++ 11之間。編輯:等等,實際上,它很混亂。 –
@sftrabbit:感謝您解決這個問題。現在什麼是將迭代器標記爲向前和輸出的規範方法? (簡單地介紹一個新的私有標籤,從兩個繼承,還是有不同的方式?) – MFH