将bool隐式转换为浮动类型没有警告?

Dan*_*nra 6 c++ clang compiler-warnings implicit-conversion

看起来这个片段在clang中编译而没有警告,即使是-Weverything:

double x;
...
if (fabs(x > 1.0)) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?还是做编译器和C++标准认为铸造booldouble的东西,有道理?

das*_*ght 9

这是制作bool整体类型的结果.根据C++标准,第3.9.1.6节

bool类型的值可以是truefalse(注:没有signed,unsigned,short,或long bool类型或值-尾注.)bool类型的值参与积分促销活动.(重点补充)

这使得bool表达式的值以与提升s float相同的方式int被提升,而没有警告,如4.5.6节所述:

类型的prvalue bool可以转换为类型的prvalue int,false变为零并true成为一个.

编辑:用C++ 11开始fabs提供了完整的类型的其他重载,因此促进直接去boolint,并停止在那里的,因为过载fabs可用于它.

  • 如果OP使用C++ 11,那么这个答案可能会改变,因为在C++ 11中,`fabs`函数不仅提供了`float`,`double`和`long double`参数的签名,而且还为整数类型,所以在这种情况下,隐式转换或提升是从`bool`到`int`,而不是`bool` - >`int` - >`float`. (5认同)