看起来这个片段在clang中编译而没有警告,即使是-Weverything:
double x;
...
if (fabs(x > 1.0)) {
...
}
我错过了什么吗?或者编译器和C ++标准是否认为将bool
转换为double
是有意义的?
答案 0 :(得分:8)
这是使bool
成为整数类型的结果。根据C ++标准,第3.9.1.6节
bool类型的值为
true
或false
(注意:没有signed
,unsigned
,short
或long
bool
类型或值。 - 结束注释) bool类型的值参与整体促销。 (重点补充)
这会使bool
表达式的值提升为float
的方式与提升int
的方式相同,而不会出现警告,如第4.5.6节所述:
bool
类型的prvalue可以转换为int
类型的prvalue,false
变为零,true
成为一个。
编辑:从C ++ 11开始fabs
为整数类型提供额外的重载,因此促销直接从bool
转到int
,然后停止在那里,因为fabs
的重载可用。