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