为什么STL算法不能从迭代器值中推导出默认值类型?

时间:2017-04-28 01:55:25

标签: c++ stl

accumulateinner_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);

这样的决定有什么特别的原因,还是只是糟糕的设计?我问,因为我知道伟大的专家制定的标准,感觉答案是前者,我只是不明白。

0 个答案:

没有答案