MSVC 中从 _Ty 警告到 int 警告的转换累积
Conversion from _Ty to int warning in MSVC accumulate
我将 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));
相关文章:
- 获取隐式转换溢出从无符号到已签名的警告
- 奇怪的缩小转换在 g++ 编译器中加倍到浮点警告
- 隐式重新解释引用时强制转换,没有警告/错误
- 将无符号转换为复杂<int>原因符号转换警告
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- MSVC 中从 _Ty 警告到 int 警告的转换累积
- 为什么在 c++ 中索引字符串会发出隐式转换警告?
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- C++:禁用隐式转换警告
- 为什么 gcc 警告只针对统一初始化缩小转换范围?
- 警告 C4267"参数":从"size_t"转换为"DWORD&quo
- 隐式转换:以下警告是否有效?
- 意外 (IMO) 常量转换警告
- C++:禁用 CMake 中的旧样式转换警告
- 键入从 DWORD 到 64 位指针的强制转换警告
- 警告 C4267"正在初始化":从'size_t'转换为"DWORD",可能会丢失数据
- isspace 函数的性能警告,从 int 转换为布尔值
- 隐式转换警告 int 到 int-looklike
- 编译器警告转换
- 将警告转换为错误