Как говорит πάντα ῥεῖ int[]
распадается на int*
.
Но эта функция sum
— решение для бедных, вам следует предпочесть accumulate
:
cout << accumulate(numbers, next(numbers, size), decay_t<decltype(numbers[0])>{});
Живой пример
Если у вас C++17 и статически выделенный массив, например int numbers[size]
, вы можете воспользоваться преимуществами cbegin
и cend
:
cout << accumulate(cbegin(numbers), cend(numbers), decay_t<decltype(numbers[0])>{});
Я попытался сравнить рекурсивный sum
с accumulate
, однако sum
исчерпал место в стеке, прежде чем я смог достичь размера vector
со значимой разницей, что сделало accumulate
явным победителем.
Я связываю тип init
аргумента accumulate
с типом элементов numbers
': decay_t<decltype(numbers[0])>{}
. Причина этого в том, что если кто-то вернется и изменит тип numbers
, а не изменит тип аргумента init
accumulate
, накопление будет присвоено неправильному типу.
Например, если мы используем линию накопления: cout << accumulate(cbegin(numbers), cend(numbers), 0)
, это нормально для int numbers[]
. Проблема возникла бы, если бы мы переключились на определение: double numbers[] = {1.3, 2.3, 3.3, 4.3};
, но не смогли изменить аргумент init
, мы бы суммировали double
s в int
. В результате получится 10, а не 11,2: http://ideone.com/A12xin.
person
Jonathan Mee
schedule
28.03.2016
const int numbers[]
совпадает сconst int* numbers
: неконстантный указатель на постоянные значения. - person   schedule 28.03.2016