2015-10-14 114 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