有accumulate
或inner_product
等STL算法可将范围缩小为标量。从历史上看,它们都需要初始值,其类型可以从初始值参数推导出来,但不能从迭代器参数推断出来。这很容易出错:
vector<float> a;
// error: deduced type is integer,
// and all the values are truncated up to the integer part.
auto sum = accumulate(a.begin(), a.end(), 0);
vector<long long> a;
// error: deduced type is integer,
// so the result can overflow.
auto sum = accumulate(a.begin(), a.end(), 0);
标准定义可能就像
template< class InputIt,
class T = typename std::iterator_traits<InputIt>::value_type>
T accumulate( InputIt first, InputIt last, T init = T {});
而不是当前的
template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );
在C ++ 17 reduce
实际上做了那种技巧
template<class InputIt>
typename std::iterator_traits<InputIt>::value_type
reduce(InputIt first, InputIt last);
但仅限于初始值不在此处。当它在这里定义通常
时template<class InputIt, class T>
T reduce(InputIt first, InputIt last, T init);
这样的决定有什么特别的原因,还是只是糟糕的设计?我问,因为我知道伟大的专家制定的标准,感觉答案是前者,我只是不明白。