Summarising your question a lot, you are asking Does the C++ standard allow a compiler to assume a bool
can only have an internal numerical representation of '0' or '1' and use it in such a way?
The standard says nothing about the internal representation of a bool
. It only defines what happens when casting a bool
to an int
(or vice versa). Mostly, because of these integral conversions (and the fact that people rely rather heavily on them), the compiler will use 0 and 1, but it doesn't have to (although it has to respect the constraints of any lower level ABI it uses).
So, the compiler, when it sees a bool
is entitled to consider that said bool
contains either of the 'true
' or 'false
' bit patterns and do anything it feels like. So if the values for true
and false
are 1 and 0, respectively, the compiler is indeed allowed to optimise strlen
to 5 - <boolean value>
. Other fun behaviours are possible!
As gets repeatedly stated here, undefined behaviour has undefined results. Including but not limited to
- Your code working as you expected it to
- Your code failing at random times
- Your code not being run at all.
See What every programmer should know about undefined behavior