正如πάντα ῥεῖ 所说, int[]
衰减到int*
.
但是这个sum
功能是穷人的解决方案,你应该更喜欢accumulate
:
cout << accumulate(numbers, next(numbers, size), decay_t<decltype(numbers[0])>{});
Live Example
如果您有 C++17 和静态分配的数组,例如int numbers[size]
,您可以利用cbegin
and cend
:
cout << accumulate(cbegin(numbers), cend(numbers), decay_t<decltype(numbers[0])>{});
我试图对递归进行基准测试sum
,accumulate
但是sum
在我能够达到vector
具有有意义差异的大小之前耗尽了堆栈空间,从而accumulate
成为明显的赢家。
我将accumulate
' init
agument 的类型与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 double
s 变成 an的参数int
。这将导致 10 而不是 11.2:http: //ideone.com/A12xin