Обратите внимание, что интерфейс reduce()
:
template<class InputIt, class T, class BinaryOp>
T reduce(InputIt first, InputIt last, T init, BinaryOp binary_op);
Примечательно, что он выводит тип из начального значения и возвращает этот тип. Вы проезжаете 1
, то есть int
. Таким образом, возвращается int
, а внутренний аккумулятор - int
. Это ... не сработает по очевидным причинам (неважно, что вы используете multiplies<float>
, результат все равно сохраняется в int
).
Вы хотите:
float result = reduce(series.begin(), series.end(), 1.0f, multiplies<float>() );
Вам даже не нужно указывать тип на multiplies
, multiplies{}
работает нормально.