这段代码看起来在clang编译时没有任何警告,即使使用了-Weverything参数:
double x;
...
if (fabs(x > 1.0)) {
...
}
我是否漏掉了什么?还是编译器和C++标准认为将bool
转换为double
是有意义的?
这段代码看起来在clang编译时没有任何警告,即使使用了-Weverything参数:
double x;
...
if (fabs(x > 1.0)) {
...
}
我是否漏掉了什么?还是编译器和C++标准认为将bool
转换为double
是有意义的?
bool
定义为整型类型带来的后果。根据 C++ 标准,第 3.9.1.6 节所述:
这使得bool 类型的值只能是 true 或 false。(注:不存在
signed
、unsigned
、short
或者long
的bool
类型或值。——末尾注释)bool 类型的值参与整型提升。(强调添加)
bool
表达式的值会像 int
一样被提升为 float
,并且不会发出警告,具体情况如第 4.5.6 节所述:
编辑:从 C++11 开始,bool 类型的 prvalue 可以转换为 int 类型的 prvalue,false 变为零,true 变为 1。
fabs
提供了额外的整型类型重载,因此促进直接从 bool
到 int
,停止在那里,因为它有一个重载的 fabs
是可用的。fabs
函数不仅提供了float
、double
和long double
参数的签名,还提供了整数类型的签名,所以在这种情况下,隐式转换或提升是从bool
到int
而不是bool
-> int
-> float
。 - user2485710