何时使用迭代器的`value_type`?

时间:2015-10-14 02:29:59

标签: c++ c++11 iterator semantics

我试图了解实际使用iterator::value_type的时间。

因为迭代器的所有运算符似乎只使用iterator::pointeriterator::reference

问题iterator::value_type实际上是用于某事吗?

额外问题:迭代器是否会继承自

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

提出一些语义问题?

编辑:要理解我提出这个问题的原因,那是因为我正在处理pointerreference是代理类的类型的迭代器。 / p>

1 个答案:

答案 0 :(得分:7)

我可以考虑在通用代码中使用它。假设您正在编写一个泛型函数,该函数总结了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看起来更整洁,更优雅。在C ++ 14中,我想不出一个非常好的用法,因为你可以在函数返回时使用自动类型推导。

编辑正如@Luc Danton在评论中所提到的,使用decltype(*begin)会在大多数情况下产生参考,因此您需要std::remove_reference,让它看起来很讨厌。所以value_type很方便。