Well, with false, not much wrong, since false must be == !true, and
if(false){this;}else{that;} must evaluate that, we're about certain
that false == 0.
False is equal to false. It's never 0, or any other numeric
value. If you convert a bool to another numeric type, false
converts to 0, but that's a different problem. (Also, you
rarely would convert a bool to any other numeric type.))
But for true, it's something else. It may be 1, -1, 0xff, or
whatever not 0.
True is true. It's never 1, -1, 0xff or whatevert. It's not a
numeric value.
False and true are values of type bool. Type bool has exactly
two values, false, and true, and no others. A expression of
type bool cannot have a value 0, or 1, or -1 or 0xFF or
whatever. It can only have a value of false or true.
In C++, for historical reasons, bool converts to numeric types,
with false converting to 0, and true to 1. In C++, for
historical reasons, numeric types and pointers convert to bool,
with the result being the same as if you'd compared them to 0.
These conversions are really only present for historical
reasons, however, and you don't use them in well written code.
But in any case, it's harder to read boolean expression when
you add equivalences with the constants.
The real problem is that it is redundant. Suppose you write
something like:
if ( a == true )
Presumably, a has type bool, or the expression doesn't really
make sense. (If a has type int, then the expression "true", of
type bool, will be converted to the integral value 1. If this
is what is wanted, it's obfuscation.) But of course, the
expression "a == true" also has type bool. So by the same
logic, if we wanted to test whether it was true, we'd write:
if ( (a == true) == true )
Except, of course, that "(a == true) == true" has type bool, so
we'll write...
A condition requires a bool (or something which converts
implicitly to bool). If you've got a bool, you've already got
what you need. If you don't have a bool, the comparison
operators (==, !=, > etc.) all result in a bool.