C4800是否有任何实际价值
Does C4800 have any real world value?
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++;
。我们所拥有的看起来像是以前定义j
为int
类型的某些代码的不完整转换。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.
相关文章:
- 是否有任何C++功能可以对地图进行排序?
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- GoogleMock是否仍然打算与任何测试框架一起使用?
- C++中是否有任何函数等同于python中字典的get函数?
- 用于检查值是否为其任何参数的帮助程序函数
- 是否可以在编译时限制类的实例数?
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 检查数组中的任何值是否等于添加到数组的当前值
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- 这些场景中的任何一个是否会造成内存泄漏
- Strchr不起作用,或者我需要一个替代方案来检查给定字符串中的任何字符是否是另一个字符串的一部分
- 如何查询范围中的任何位是否在 C++ std::bitset 中设置
- 默认情况下,任何函数是否能够就地工作
- 检查Eigen::矩阵的任何元素是否与零不同
- C++检查前 5 个或接下来的 5 个元素中的任何一个是否等于值
- 程序状态的任何变化是否构成可观察的行为?
- 检查循环中出现的任何条件是否已满足c++
- 是否可以遍历一个类以查看一个类或其任何基础是否具有特定的特征?