To most C++ programmers — or at least those like me with a short memory — it may feel like
bool has always been there. However it is still not present in its ancestor C (though C99 has
_Bool), and it was only introduced in C++98. At that time, there was resistance to it, and examination of existing code (that was mostly using macros to simulate a boolean type) showed that preventing implicit conversion between boolean values and integer numbers would have broken a lot of things. So in C++,
int conversion is implicit, with
false converting to 0 and
true to 1.
I think that this implicit conversion from
bool is generally not needed in “real-world” code, and that it is in fact a source of bugs.
For example, this tweet shows that because of this implicit conversion, a typo like in
int x = 1 < y; (where
< was meant to be the left-shift operator
<<) didn’t raise any alarm.
In my coding experience, I cannot think of useful cases where I need to convert a
bool to something else, apart from
printf statements used during debugging — but for these, I have taken the habit of doing an explicit conversion anyway, e.g.:
I can certainly imagine cases where a
bool could be converted to 0 or 1, to be used in a mathematical expression, e.g.:
a = useC * c, but I think this would be better expressed as
a = useC ? c : 0.
Of course my experience is limited, and there may be genuine situations where this conversion could genuinely help — Please let me know. But I think that in these cases, making the conversion explicit should be trivial, and also useful by making it more obvious (
a = int(useC) * c). Now, if such conversion is needed for a lot of your code, maybe it’s a sign that the
bool type may not be the right choice.
Note: clang-tidy offers readability-implicit-bool-conversion, but by default it catches more than just conversions from