MSVC 中从 _Ty 警告到 int 警告的转换累积

Conversion from _Ty to int warning in MSVC accumulate

本文关键字:警告 转换 int 中从 Ty MSVC      更新时间:2023-10-16

我将 MSVC 警告提高到 4 级,并且在使用累积而不是 boost::circular_buffer 时遇到了问题。此代码:

boost::circular_buffer<unsigned short> shorts;
shorts.resize(10);
unsigned short res = std::accumulate(shorts.begin(), shorts.end(), static_cast<unsigned short>(0));

失败,并在累积模板中显示possible loss of data警告(数字(:

// FUNCTION TEMPLATE accumulate
template<class _InIt,
class _Ty,
class _Fn>
_NODISCARD inline _Ty accumulate(const _InIt _First, const _InIt _Last, _Ty _Val, _Fn _Reduce_op)
{   // return noncommutative and nonassociative reduction of _Val and all in [_First, _Last), using _Reduce_op
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);
for (; _UFirst != _ULast; ++_UFirst)
{
_Val = _Reduce_op(_Val, *_UFirst); // <-- THIS IS WHERE THE WARNING IS
}
return (_Val);
}

任何想法可能出了什么问题?

25.9.2 累积 [累积]std::accumulate的效果定义为acc = std::move(acc) + *i。由于C++出于某种原因不支持对小于int的整数类型进行算术运算,而是在求和之前将+双方的参数提升为int,因此结果将是一个int。因此,您在这里收到一个看似不可避免的警告。

一种可能的解决方法是定义要unsinged int累加器,然后将最终结果转换为所需的类型:

unsigned short res{static_cast< unsigned short >(::std::accumulate(shorts.begin(), shorts.end(), 0u));