2015-10-14 53 views
3

我想了解何時實際使用iterator::value_type何時使用迭代器的「value_type」?

因爲,迭代器的所有運算符似乎只使用iterator::pointeriterator::reference

問題:iterator::value_type實際用於什麼?

額外的問題:會的迭代器從

std::iterator<std::random_access_iterator_tag, int, std::ptrdiff_t, bool*, bool&> 

提出了一些語義問題遺傳嗎?

編輯:要理解爲什麼我問這個問題,是因爲我在一個迭代工作的類型,其pointerreference是代理類。

+0

關於EDIT,在這種情況下,它當然有用的'value_type'作爲一個單獨的'typedef',由於'remove_reference_t '是不再底層值的類型的,但具有代理的類型。 – vsoftco

回答

6

我能想到的通用代碼中使用它。假設你正在編寫一個總結C++ 11範圍的泛型函數。你可以把它寫成

template<typename It> 
auto sum(It begin, It end) -> typename It::value_type 
{ 
    typename It::value_type _sum{}; 
    // compute the sum 
    return _sum; 
} 

當然你可以使用decltype(*begin)代替,但使用value_type看起來整潔-ER和更優雅。在C++ 14中,我想不出一個很好的用法,因爲你可以在函數返回時使用自動類型推導。

編輯正如在評論中提及的@Luc丹東,使用decltype(*begin)產生參考的大部分時間,所以你需要std::remove_reference,這使得它看起來很討厭。所以value_type來得方便。

+1

如果「它」是例如'std :: vector :: iterator',那麼'decltype(* begin)'是'int&',它比'value_type'更對應於'reference'。 –

+0

@LucDanton好點! – vsoftco

+2

@LucDanton它甚至不保證返回值類型,因爲原則上可以通過代理來實現迭代器,而不一定是指針。 – vsoftco