第三个参数std :: accumulate的充分理由?

时间:2013-09-09 08:33:24

标签: c++ c++11

我刚刚编写了一个小帮助函数作为std::accumulate的包装器:

template <typename FwdIter> inline
auto accumulate(FwdIter begin, FwdIter end) -> std::iterator_traits<FwdIter>::value_type
{
    return std::accumulate(begin, end, std::iterator_traits<FwdIter>::value_type());
}

我可能会在这里忽略一些东西。为什么这不是std::accumulate的现有重载?功能显得如此明显,以至于不容忽视;有人有充分理由强制要求第三个参数。

(另请参阅Understanding std::accumulate - 我理解为什么你希望能够提供初始值,我只是不明白为什么它是强制性的)

1 个答案:

答案 0 :(得分:7)

这样可以推导出模板参数。

宣言是

template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );

,推断返回值的唯一参数是init。因为必须是迭代器的值类型。

是的,它仍然可以默认std::iterator_traits<InputIt>::value_type()。委员会可能根本就没有想到这一点。

PS:你把我和汽车弄糊涂了。我认为它没有被添加,因为它在C ++ 03中是不可能的,并且当C ++ 11完成时被忽略,因为它看起来不需要任何改变。但这里需要;模板参数在您在标准位置写入返回类型时声明。