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

时间:2014-05-26 16:10:02

标签: c++ clang compiler-warnings implicit-conversion

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

double x;
...
if (fabs(x > 1.0)) {
   ...
}

我错过了什么吗?或者编译器和C ++标准是否认为将bool转换为double是有意义的?

1 个答案:

答案 0 :(得分:8)

这是使bool成为整数类型的结果。根据C ++标准,第3.9.1.6节

  

bool类型的值为truefalse(注意:没有signedunsignedshortlong bool类型或值。 - 结束注释) bool类型的值参与整体促销。 (重点补充)

这会使bool表达式的值提升为float的方式与提升int的方式相同,而不会出现警告,如第4.5.6节所述:

  

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

编辑:从C ++ 11开始fabs为整数类型提供额外的重载,因此促销直接从bool转到int,然后停止在那里,因为fabs的重载可用。