为什么使用 not 运算符时警告“强制 value to bool 'true' or 'false'”会消失?

问题描述 投票:0回答:1

考虑使用 Visual Studio 2015 编译的以下代码:

#include <iostream>
#include <cassert>

void foo(bool b)
{
    std::cout << b;
}

int main()
{
    int a;

    foo(a = 2);       // Getting warning #4800
    foo(!(a = 2));    // Not getting any warning

    return 0;
}

foo( a = 2 )
产生警告 4800
'int': forcing value to bool 'true' or 'false'
,很好。

但是

foo( !(a = 2) )
不会产生警告。为什么?在某些时候,有一个 int 可以进行 bool 转换!

c++ warnings
1个回答
1
投票

foo(a = 2)
相当于
bool b = (a = 2)
。表达式
a = 2
返回
a
,因此它相当于

a = 2;
bool b = a; //Conversion of 'int' to 'bool' -> Warning!

foo(!(a = 2))
相当于
bool b = !(a = 2)
。表达式
a = 2
返回
a
:

a = 2;
bool b = !a; //'!a' is legal => It returns a bool -> No warning!

请注意,您可以将

operator!
应用于
int
,这会否定
int
,从而返回
bool
。这就是为什么没有性能警告。

© www.soinside.com 2019 - 2024. All rights reserved.