3 c++ gcc type-conversion unsigned-integer
我在执行以下代码时遇到了这个问题:
int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();
Run Code Online (Sandbox Code Playgroud)
没有int对vi.size()输出进行强制转换是垃圾,因为size()返回一个无符号整数。
如果我没有在 google 上搜索 vector 的参考资料,我永远不会想到这一点。有没有办法避免这个陷阱?使用-Walland -pedantic,gcc 似乎没有给出关于这种划分的任何警告。
gcc有-Wconversion标志,在这种情况下警告我:
warning: conversion to ‘int’ from ‘std::vector<int>::size_type {aka long unsigned int}’ may alter its value [-Wconversion]
int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();
^
Run Code Online (Sandbox Code Playgroud)
在GCC文档说:
-W转换
警告可能会改变值的隐式转换。这包括实数和整数之间的转换,例如当 x 为双精度时 abs (x);有符号和无符号之间的转换,如无符号 ui = -1;和转换为更小的类型,如 sqrtf (M_PI)。不要警告像 abs ((int) x) 和 ui = (unsigned) -1 这样的显式强制转换,或者如果值没有像 abs (2.0) 那样被转换改变。可以使用 -Wno-sign-conversion 禁用有关有符号和无符号整数之间转换的警告。
对于 C++,还警告混淆用户定义转换的重载解析;和从不使用类型转换运算符的转换:转换为 void、相同类型、基类或对它们的引用。除非显式启用 -Wsign-conversion,否则 C++ 中默认禁用有关有符号和无符号整数之间转换的警告。
| 归档时间: |
|
| 查看次数: |
2193 次 |
| 最近记录: |