布尔类型隐式转换为浮点型时没有警告?

6

这段代码看起来在clang编译时没有任何警告,即使使用了-Weverything参数:

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

我是否漏掉了什么?还是编译器和C++标准认为将bool转换为double是有意义的?


1
C和C++标准对此不需要任何警告。但我会向clang团队报告这个错误。我预计它不会被紧急修复,但最终可能会得到解决。 - Mats Petersson
1个回答

10
这是将 bool 定义为整型类型带来的后果。根据 C++ 标准,第 3.9.1.6 节所述:

bool 类型的值只能是 true 或 false。(注:不存在 signedunsignedshort 或者 longbool 类型或值。——末尾注释)bool 类型的值参与整型提升。(强调添加)

这使得 bool 表达式的值会像 int 一样被提升为 float,并且不会发出警告,具体情况如第 4.5.6 节所述:

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

编辑:从 C++11 开始,fabs 提供了额外的整型类型重载,因此促进直接从 boolint,停止在那里,因为它有一个重载的 fabs 是可用的。

6
如果OP使用C++11,则此答案可能会稍微改变,因为在C++11中,fabs函数不仅提供了floatdoublelong double参数的签名,还提供了整数类型的签名,所以在这种情况下,隐式转换或提升是从boolint而不是bool -> int -> float - user2485710
@user2485710,感谢您的精彩评论! - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接