boost::lexical_cast wrong output
The C++ standard does not specify how a Boolean is stored in memory, only that there are two possible values: true
and false
. Now, on your machine, I presume these are stored, respectively, as 1
and 0
. The compiler is allowed to make assumptions, and in particular it's allowed to assume that these are going to be the only two values stored in a Boolean.
Thus, when boost::lexical_cast
sees a Boolean, it runs code that probably looks something like this (after optimization)
// Gross oversimplification
std::string lexical_cast(bool value) {
char res = '0' + (int)value;
return std::string(1, res);
}
If value
is 0
or 1
, this works fine and does what you want. However, you put a 71
into it. So we add the ASCII code of '0'
(48
) to 71
and get 119
, the ASCII code of 'w'
.
Now, I'm not a C++ standard expert, but I would guess that storing a non-standard value into a Boolean with memcpy
is undefined behavior. At the very least, your code is non-portable. Perhaps someone more versed in the standard can fill in the holes in my knowledge as far as that's concerned.