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.