使用std::accumulate求和触发C4244数据转换丢失警告的原因是什么?
问题根因
std::accumulate 第三个入参是求和的初始值,该参数的类型决定了整个累加过程的计算类型以及函数返回值类型:
- 你代码里传入的初始值是
0,这是默认的int类型,因此模板推导得到的累加计算类型_Ty为int - 但你容器存储的元素是
LONGLONG(即__int64)类型,累加过程中每个LONGLONG类型的元素都要先转换为int类型再参与计算,编译器检测到该窄化转换可能丢失数据,因此抛出C4244警告 - 哪怕你把接收返回值的变量改成
auto,也只会把变量推导为int类型,无法解决类型不匹配的问题,警告依然存在。
解决方案
只需要把初始值修改为和容器元素同类型的0即可,有两种常见写法:
- 直接使用长整型字面量后缀
// 0LL 代表LONGLONG类型的0,和容器元素类型匹配 LONGLONG nEstimatedTimeTotal = std::accumulate(v.begin(), v.end(), 0LL);
- 显式转换初始值为目标类型,兼容性更强,避免不同编译器下字面量类型的差异
LONGLONG nEstimatedTimeTotal = std::accumulate(v.begin(), v.end(), (LONGLONG)0);
内容的提问来源于stack exchange,提问作者Tom Tom
相关产品推荐
相关产品推荐

