什么时候使用迭代器的“value_type”?
When is a `value_type` of an iterator used?
我想了解什么时候实际使用 iterator::value_type
。
因为,迭代器的所有运算符,似乎只使用 iterator::pointer
和 iterator::reference
。
问题:iterator::value_type
是真的用来做什么的吗?
附加问题:迭代器是否继承自
std::iterator<std::random_access_iterator_tag, int, std::ptrdiff_t, bool*, bool&>
提出一些语义问题?
编辑: 要理解我为什么问这个问题,是因为我正在为 pointer
和 reference
类型的迭代器工作是代理 类.
我可以考虑在泛型代码中使用它。假设您在 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中我想不出非常有用,因为您可以对函数 return.
进行自动类型推导
EDIT 正如@Luc Danton 在评论中提到的那样,大多数时候使用 decltype(*begin)
会产生参考,因此您需要 std::remove_reference
,这让它看起来很讨厌。所以 value_type
派上用场了。
我想了解什么时候实际使用 iterator::value_type
。
因为,迭代器的所有运算符,似乎只使用 iterator::pointer
和 iterator::reference
。
问题:iterator::value_type
是真的用来做什么的吗?
附加问题:迭代器是否继承自
std::iterator<std::random_access_iterator_tag, int, std::ptrdiff_t, bool*, bool&>
提出一些语义问题?
编辑: 要理解我为什么问这个问题,是因为我正在为 pointer
和 reference
类型的迭代器工作是代理 类.
我可以考虑在泛型代码中使用它。假设您在 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;
}
当然你可以使用在C++14中我想不出非常有用,因为您可以对函数 return.decltype(*begin)
代替,但是使用value_type
看起来更整洁更优雅。
EDIT 正如@Luc Danton 在评论中提到的那样,大多数时候使用 decltype(*begin)
会产生参考,因此您需要 std::remove_reference
,这让它看起来很讨厌。所以 value_type
派上用场了。