c++ - Why warning "forcing value to bool 'true' or 'false'" disappears when using not operator? -


consider following code compiled visual studio 2015:

#include <iostream> #include <cassert>  void foo( bool b ) {     std::cout << b; }  int main() {     int a;      foo( = 2 );       // getting warning #4800     foo( !(a = 2) );    // not getting warning      return 0; } 

foo( = 2 ) produces warning 4800 'int': forcing value bool 'true' or 'false', fine.

but foo( !(a = 2) ) not produce warning. why? @ point there has been int bool cast!

foo(a = 2) equivalent bool b = (a = 2). expression a = 2 returns a, equivalent to

a = 2; bool b = a; //conversion of 'int' 'bool' -> warning! 

foo(!(a = 2)) equivalent bool b = !(a = 2). expression a = 2 returns a:

a = 2; bool b = !a; //'!a' legal => returns bool -> no warning! 

note can apply operator! int, negates int, , returns bool. that's why there no performance warning.


Comments