std::accumulate的类型转换坑:始终返回零
多年以来,我的某工程里面有这样一行:
double a = std::accumulate(currentVChangeRateData.begin(), currentVChangeRateData.end(), 0);
currentVChangeRateData
里面大部分情况下是个包含一些很小的数的数组。求和结果a
要拿到别处去用,一般是个零点几的修正量,为零也不会出错并且区别不容易看出来。
然后,某天其他地方要用类似的语句,我就直接复制放进去,然后发现,无论如何这倒霉玩意儿都返回零。
最后发现,问题出在最不起眼的最后一个初始值
参数0
上面。std::accumulate
根据初始值
的类型进行特化,我给了个0
,是整数,于是整个过程中所有值都被先强制转换(起码在MSVC下,这个过程是静默的),再accumulate
。显然,如果数组里面放的全是零点几,那么求和出来的结果只能是零。
这两年可怜了劳资辛苦设计的修正项啊啊啊啊啊啊啊啊啊啊啊啊!