2017-04-07 225 views
18

模板類std::iterator被設置爲在C++ 17中被棄用。爲什麼這樣?確保std::iterator_traits有效,特別是在可以使用默認模板參數的情況下,它是一種非常方便的方式。有沒有其他方式在C++ 17中做到這一點?std :: iterator爲什麼不推薦使用?

+1

是的,在C++ 17中做同樣的事情有一個方便的方法:你只是做同樣的事情。 「已棄用」意味着只有**,它**可能會在未來消失。這並不意味着你不能使用它,或者它不會像往常一樣做。 –

+0

@PeteBecker:但問題是,如果它被棄用,那麼爲什麼程序員會在下一個版本左右的時候使用它?爲什麼它開始使用,如果它非常方便? – Nawaz

+0

@Nawaz - 這個問題倒退了。如果它在標準中,爲什麼不使用它? **標準中的任何**可能會在未來消失。是的,不贊成使用的東西可能會消失,或者可能不會;考慮一下C頭文件,這些頭文件在C++中不推薦使用,但實際上,它們永遠不會消失。 –

回答

16

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_functionbinary_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(這也不是太困難,而我實際上更喜歡它)。

+2

STL在[LWG 2438](https://timsong-cpp.github.io/lwg-issues/2438)中的論點似乎也很合理:該名稱可能誤導用戶(特別是來自* ahem *某些其他編程語言)認爲派生是強制性的,或者寫一個接受'std :: iterator'的函數是有意義的。 –

相關問題