【问题标题】:No warning for implicit cast of bool to floating type?没有关于将 bool 隐式转换为浮点类型的警告?
【发布时间】:2014-05-26 16:10:02
【问题描述】:

看起来这个 sn-p 在没有警告的情况下在 clang 中编译,即使使用 -Weverything:

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

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

【问题讨论】:

  • C 和 C++ 标准对此不需要任何警告。但是我会为此向铿锵人提出一个错误。我预计它不会紧急修复,但最终可能会完成。

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


【解决方案1】:

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

bool 类型的值要么是true 要么是false(注意:没有signedunsignedshortlongbool 类型或值。——结束注释)bool 类型的值参与积分促销。 (重点加了)

这使得bool 表达式的值被提升为float,就像提升ints 一样,没有警告,如第 4.5.6 节所述:

bool 类型的纯右值可以转换为 int 类型的纯右值,false 变为 0,true 变为 1。

编辑:从 C++11 开始,fabs 为整数类型提供了额外的重载,因此提升直接从 boolint,并停在那里,因为重载fabs 可用。

【讨论】:

  • 如果 OP 使用 C++11,这个答案可能会通过触摸改变,因为在 C++11 中,fabs 函数不仅为floatdoublelong double 参数也适用于整数类型,因此在这种情况下,隐式转换或提升是从 boolint,而不是 bool -> int -> float
  • @user2485710 感谢您的精彩评论!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多