正如πάντα ῥεῖ 所说, int[]衰减到int*.
但是这个sum功能是穷人的解决方案,你应该更喜欢accumulate:
cout << accumulate(numbers, next(numbers, size), decay_t<decltype(numbers[0])>{});
Live Example
如果您有 C++17 和静态分配的数组,例如int numbers[size],您可以利用cbeginand cend:
cout << accumulate(cbegin(numbers), cend(numbers), decay_t<decltype(numbers[0])>{});
我试图对递归进行基准测试sum,accumulate但是sum在我能够达到vector具有有意义差异的大小之前耗尽了堆栈空间,从而accumulate成为明显的赢家。
我将accumulate' initagument 的类型与numbers' 元素的类型相关联:decay_t<decltype(numbers[0])>{}。这样做的原因是,如果有人回来更改 的类型numbers,而不更改 的参数类型,accumulate则init累积将分配给错误的类型。
例如,如果我们使用累积线:cout << accumulate(cbegin(numbers), cend(numbers), 0),这对int numbers[]. 如果我们切换到 define: 就会出现问题,double numbers[] = {1.3, 2.3, 3.3, 4.3};但是我们没有改变init我们将 sum doubles 变成 an的参数int。这将导致 10 而不是 11.2:http: //ideone.com/A12xin