std::accumulate的类型转换坑:始终返回零

多年以来,我的某工程里面有这样一行:

double a = std::accumulate(currentVChangeRateData.begin(), currentVChangeRateData.end(), 0);

currentVChangeRateData里面大部分情况下是个包含一些很小的数的数组。求和结果a要拿到别处去用,一般是个零点几的修正量,为零也不会出错并且区别不容易看出来

然后,某天其他地方要用类似的语句,我就直接复制放进去,然后发现,无论如何这倒霉玩意儿都返回零。

最后发现,问题出在最不起眼的最后一个初始值参数0上面。std::accumulate根据初始值的类型进行特化,我给了个0是整数,于是整个过程中所有值都被先强制转换(起码在MSVC下,这个过程是静默的),再accumulate。显然,如果数组里面放的全是零点几,那么求和出来的结果只能是零。

这两年可怜了劳资辛苦设计的修正项啊啊啊啊啊啊啊啊啊啊啊啊!

  • 最后更改: 2023/07/20 09:58