模板類std::iterator
被設置爲在C++ 17中被棄用。爲什麼這樣?確保std::iterator_traits
有效,特別是在可以使用默認模板參數的情況下,它是一種非常方便的方式。有沒有其他方式在C++ 17中做到這一點?std :: iterator爲什麼不推薦使用?
回答
從the proposal that suggested its deprecation:
爲幫助編寫迭代器類,原來的標準庫提供的迭代器類模板自動五大類型定義預計iterator_traits每個迭代的聲明。然後將其在庫本身使用,例如在
std::ostream_iterator
規格:template <class T, class charT = char, class traits = char_traits<charT> > class ostream_iterator: public iterator<output_iterator_tag, void, void, void, void>;
的
void
參數的長序列是少得多清楚地向讀者不是簡單的類定義本身,提供預期的typedef這是當前工作草案採用的方法,遵循C++ 14中設置的模式,其中我們不推薦遍及函數庫unary_function
和binary_function
的推導。除了清晰度降低之外,迭代器模板還爲粗心大意設置了一個陷阱,就像在典型的用法中它將是一個依賴的基類一樣,這意味着它不會在類內進行名稱查找期間查找或其成員職能。這導致吃驚用戶試圖理解爲什麼下面簡單的用法不工作:
#include <iterator> template <typename T> struct MyIterator : std::iterator<std::random_access_iterator_tag, T> { value_type data; // Error: value_type is not found by name lookup // ... implementations details elided ... };
單獨清晰的理由足以說服LWG到標準庫規範更新不再授權標準的迭代器adapators爲來自
std::iterator
,所以在標準本身內不再使用該模板。因此,它看起來像是一個強大的棄用對象。
您還可以在LWG 2438中看到STL的推理。 (h/t T.C.)
至於其他一些做法,並不是真的。你基本上可以實現你自己的版本std::iterator
(這不是太難)或手動寫出所有這些typedef(這也不是太困難,而我實際上更喜歡它)。
STL在[LWG 2438](https://timsong-cpp.github.io/lwg-issues/2438)中的論點似乎也很合理:該名稱可能誤導用戶(特別是來自* ahem *某些其他編程語言)認爲派生是強制性的,或者寫一個接受'std :: iterator'的函數是有意義的。 –
- 1. 爲什麼不推薦使用std :: strstream?
- 2. 爲什麼Logger.isInfoEnabled不推薦使用org.jboss.logging.Logger?
- 3. 爲什麼不推薦使用isJavaLetterOrDigit?
- 4. 爲什麼不推薦使用JButton.enable?
- 5. 爲什麼不推薦使用struts2 FilterDispatcher?
- 6. 爲什麼SET不推薦使用?
- 7. 爲什麼不推薦使用StringTokenizer?
- 8. Object.observe()爲什麼不推薦使用
- 9. 爲什麼不推薦使用body.scrollTop?
- 10. 爲什麼不推薦HibernateTemplate?
- 11. 爲什麼不推薦使用window.showModalDialog?代替使用什麼?
- 12. 爲什麼不推薦使用assert_template,而應該使用什麼?
- 13. 爲什麼Visual Studio使用std :: iterator <>而不是mine :: iterator <>
- 14. jQuery切換不推薦使用什麼?
- 15. 爲什麼gunicorn_django不再被推薦?
- 16. 爲什麼不通過推薦工作?
- 17. 爲什麼不再推薦mysql擴展?
- 18. 什麼是C++ 11標準的等價物不推薦使用std :: auto_ptr?
- 19. 爲什麼std :: count(_if)返回iterator :: difference_type而不是size_t?
- 20. 爲什麼不推薦使用xmp HTML標記?
- 21. 爲什麼在Rails中不推薦使用auto_link?
- 22. 爲什麼不推薦使用hibernate org.hibernate.classic.Validatable接口?
- 23. 爲什麼在Python中不推薦使用MutableString?
- 24. 爲什麼UIAlertView如果不推薦使用iOS 8?
- 25. 爲什麼在PHP中不推薦使用`ereg`?
- 26. 爲什麼不推薦使用hibernate的ClassMetadata.getIdentifier(Object,EntityMode)
- 27. 爲什麼在JAVA中不推薦使用默認包?
- 28. 爲什麼在Django 1.5+中不推薦使用markdown?
- 29. 爲什麼不推薦使用[DataMember(EmitDefaultValue = false)]?
- 30. 爲什麼不推薦在SQL中使用「LIKE」?
是的,在C++ 17中做同樣的事情有一個方便的方法:你只是做同樣的事情。 「已棄用」意味着只有**,它**可能會在未來消失。這並不意味着你不能使用它,或者它不會像往常一樣做。 –
@PeteBecker:但問題是,如果它被棄用,那麼爲什麼程序員會在下一個版本左右的時候使用它?爲什麼它開始使用,如果它非常方便? – Nawaz
@Nawaz - 這個問題倒退了。如果它在標準中,爲什麼不使用它? **標準中的任何**可能會在未來消失。是的,不贊成使用的東西可能會消失,或者可能不會;考慮一下C頭文件,這些頭文件在C++中不推薦使用,但實際上,它們永遠不會消失。 –