C4800有没有真正的世界价值?

Luc*_*jer 5 c++ clang

如下所述的microsoft c ++编译器中的C4800警告:

https://msdn.microsoft.com/en-us/library/b6801kcy.aspx

制作此代码:

// C4800.cpp
// compile with: /W3
int main() {
  int i = 0;

 // try..
 // bool i = 0;

  bool j = i;   // C4800
  j++;
}
Run Code Online (Sandbox Code Playgroud)

抛出C4800警告:"'type':强制值为bool'true'或'false'(性能警告)"

微软似乎认为这是一个相当重要的,并将其作为Level3警告,但Clang显然认为不是这样,因为对它的最大警告水平没有任何投诉.

是否有任何人可以提出的现实世界的错误,C4800会指出这会让它值得启用吗?

Jer*_*fin 3

基本上,这只是警告您已将某些其他整数类型转换为 a bool,并且此转换并非完全免费。

它主要存在(至少在我看来)是为了警告您将bools 与其他整数类型混合,这不仅会导致性能略有下降,而且还可能表明代码中存在一些混乱。查看问题中的代码:

  int i = 0;

 // try..
 // bool i = 0;

  bool j = i;   // C4800
  j++;
Run Code Online (Sandbox Code Playgroud)

...我们所拥有的看起来j像是之前定义为类型的某些代码的不完整转换int。的定义j已被编辑,因此它现在的类型为bool,但我们仍然从 中为它分配一个值int,并且(更糟糕的是)在其上使用后增量,如果j有类型int,这两者都会有意义,但实际上没有t 具有j类型bool。

所以,问题是我们是否真的想用j比较的结果来分配什么:或者可能是一个更完整的转换,也bool j = (i != 0);将变成i:bool

bool i = false;

// ...
bool j = i; // no warning

j = true;   // cleaner way of producing the same result as the post-increment.
Run Code Online (Sandbox Code Playgroud)