考虑这是在 MS Visual Studio 2005(可能还有其他)中编译的:
CPoint point1( 1, 2 );
CPoint point2( 3, 4 );
const bool point1And2Identical( point1 == point2 ); // C4800 warning
const bool point1And2TheSame( ( point1 == point2 ) == TRUE ); // no warning
什么……?MSVC 编译器是不是脑死了?据我所知,TRUE 是#defined 为 1,没有任何类型信息。那么这两条线之间有什么不同呢?在这两种情况下,括号内的表达式类型肯定是相同的吗?[这部分问题现在在下面的评论中得到了令人满意的回答]
就个人而言,我认为通过使用 == TRUE 选项来避免警告是丑陋的(尽管比 != 0 替代方案更丑陋,尽管更严格正确),最好使用 #pragma warning( disable:4800 )暗示“我的代码很好,编译器是个混蛋”。同意?
注意 - 我已经看到关于 C4800 的各种讨论,讨论将整数分配给布尔值,或者将带有大薯条(拿着洋葱)的汉堡组合投射到布尔值,并想知道为什么会有奇怪的结果。对于一个看起来简单得多的问题,我找不到明确的答案……总的来说,这可能只是 C4800 的亮点。