C4800是否有任何实际价值

Does C4800 have any real world value?

本文关键字:任何实 是否 C4800      更新时间:2023-10-16

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++;
}

抛出 C4800 警告:"'类型':强制值为布尔值'真'或'假'(性能警告)"

Microsoft似乎认为它相当重要,并将其作为 Level3 警告,但 Clang 显然认为它不是,因为在 -Weverything,它的最高警告级别为零。

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

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

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

  int i = 0;
 // try..
 // bool i = 0;
  bool j = i;   // C4800
  j++;

。我们所拥有的看起来像是以前定义jint类型的某些代码的不完整转换。j的定义已经过编辑,所以它现在是 bool 型,但我们仍然从int中为它分配一个值,并且(更糟)在其上使用后递增,如果j有类型 int,这两者都是有意义的,但实际上没有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.