C4800 是否有任何实际价值?

5
微软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警告:“'type' : forcing value to bool 'true' or 'false' (performance warning)”

微软似乎认为这很重要,并将其作为Level3警告,然而Clang显然认为它不是,因为在-Weverything(其最高警告级别)下没有任何投诉。

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


2
阅读以下文字:“性能警告”。它只是在警告您,这可能会比您预期的要慢/更昂贵一些。 - Jerry Coffin
3
性能下降也是一个bug :) 你能想到一个现实世界的案例,其中存在不必要的性能下降,这个警告会指出吗? - Lucas Meijer
1
如果你还没有找到的话,这个问题可能会对你有些帮助。第一个答案似乎表明,“性能警告”不再是警告的主要目的。 - jaggedSpire
这种转换通常不会导致性能下降,它在许多情况下可能是无操作的,因为实现不需要将bool表示为一或零。只有当您将其强制转换回int或比较bool时,才需要限制值的要求 - 这应该相当罕见。 - skyking
正如警告信息所述,这不是潜在错误,而是一条性能警告。 - AnT stands with Russia
也许clang足够聪明,它会在编译时将代码转换为bool j = false;,而对于MS编译器来说,这是一个运行时问题。 - M.M
1个回答

3
基本上,这只是在警告您将其他整数类型转换为 bool,而这种转换并不完全免费。
它主要存在(至少在我看来)是为了警告您正在将 bool 与其他整数类型混合使用,这不仅会导致性能略微降低,还可能表明代码中存在一些混淆。查看问题中的代码:
  int i = 0;

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

  bool j = i;   // C4800
  j++;

我们现在看到的似乎是一段不完整的代码转换,之前定义了变量 j 为 int 类型。现在我们把 j 的类型改为了 bool,但仍然从 int 类型赋值给它,并且更糟糕的是,还对其进行了后置自增运算。如果 j 是 int 类型,这些操作都是有意义的,但对于 bool 类型的 j 来说就不合适了。
所以问题在于我们是否真正想要将 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.

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