bugprone-misplaced-widening-cast¶
当计算结果被强制转换为更大类型时,此检查会发出警告。如果强制转换的目的是为了避免精度损失,那么强制转换的位置就不正确,可能会导致精度损失。否则,强制转换无效。
示例代码
long f(int x) {
return (long)(x * 1000);
}
结果 x * 1000
最初使用 int
精度计算。如果结果超过 int
精度,就会发生精度损失。然后结果被转换为 long
。
如果没有精度损失,则可以删除强制转换,或者可以显式地强制转换为 int
。
如果要避免精度损失,请将强制转换放在正确的位置,例如
long f(int x) {
return (long)x * 1000;
}
隐式强制转换¶
完全忘记放置强制转换至少和放置错误一样危险,而且至少和放置错误一样常见。如果启用了 CheckImplicitCasts
,则检查还会检测这些情况,例如
long f(int x) {
return x * 1000;
}
浮点数¶
目前,只针对整数转换发出警告。此代码不会发出警告
double f(float x) {
return (double)(x * 10.0f);
}
选项¶
- CheckImplicitCasts¶
如果为 true,则启用隐式强制转换检测。默认值为 false.