Стандарт C ++ не определяет, как логическое значение хранится в памяти, только то, что есть два возможных значения: true
и false
. Теперь, на вашей машине, я предполагаю, что они хранятся соответственно как 1
и 0
. Компилятору разрешено делать предположения, и, в частности, он может предполагать, что это будут единственные два значения, хранящиеся в логическом значении.
Таким образом, когда boost::lexical_cast
видит логическое значение, он запускает код, который, вероятно, выглядит примерно так (после оптимизации)
// Gross oversimplification
std::string lexical_cast(bool value) {
char res = '0' + (int)value;
return std::string(1, res);
}
Если value
равен 0
или 1
, это прекрасно работает и делает то, что вы хотите. Тем не менее, вы положили 71
в него. Поэтому мы добавляем код ASCII '0'
(48
) к 71
и получаем 119
, код ASCII 'w'
.
Теперь я не эксперт по стандарту C ++, но я бы предположил, что сохранение нестандартного значения в логическое значение с memcpy
- неопределенное поведение. По крайней мере, ваш код непереносим. Возможно, кто-то более сведущий в стандарте может заполнить пробелы в моих знаниях, насколько это касается.