Engineered bool сравнивается как с истинным, так и с ложным, почему?
Пример сильфона компилируется, но вывод довольно странный:
#include <iostream>
#include <cstring>
struct A
{
int a;
char b;
bool c;
};
int main()
{
A v;
std::memset( &v, 0xff, sizeof(v) );
std::cout << std::boolalpha << ( true == v.c ) << std::endl;
std::cout << std::boolalpha << ( false == v.c ) << std::endl;
}
вывод:
true
true
Может кто-нибудь объясняет, почему?
Если это имеет значение, я использую g++ 4.3.0
Ответы
Ответ 1
Обнаружено это в стандарте С++, раздел 3.9.1 "Основные типы" (обратите внимание на магическую сноску 42):
6. Values of type bool are either true or false. 42)
42) Использование значения bool способами, описанными в этом международном стандарте как '' undefined, например, путем изучения значения неинициализированной автоматической переменной, может привести к тому, что он будет вести себя так, как если бы он не был ни истинным, ни ложным.
Это не совсем понятно для меня, но, кажется, отвечает на вопрос.
Ответ 2
Результатом перезаписи памяти, используемой v
, является undefined поведение.
Все может случиться, в соответствии со стандартом (включая компьютер, летящий и едущий на завтрак).
Ответ 3
Логическое значение, память которого установлена в значение, которое не равно или равно нулю, имеет поведение undefined.
Ответ 4
Я нашел ответ. 3.9.1-6 говорит:
Значения типа bool являются либо истинными, либо false.42) [Примечание: нет подписанных, беззнаковые, короткие или длинные типы bool или значения. ] Как описано ниже, bool ценности ведут себя как целые типы. Значения типа bool участвуют в интегральные поощрения (4.5).
В примечании 42 говорится:
42) Используя значение bool способами описанный этим Интернационалом Стандарт как '' undefined, например, изучение стоимости неинициализированная автоматическая переменная, может привести к тому, что он будет вести себя так, как будто это ни истина, ни ложь.
Ответ 5
Я не могу найти ничего в стандарте, который указывает, почему это произойдет (возможно, моя ошибка здесь) - это включает ссылку, предоставленную 7vies, что само по себе не очень полезно. Это определенно поведение undefined, но я не могу объяснить специфическое поведение, наблюдаемое OP.
Как практический вопрос, я очень удивлен, что выход
true
true
Используя VS2010, вывод гораздо проще объяснить:
false
false
В этом последнем случае происходит следующее:
- сравнения с boolean
true
реализуются компилятором как тесты для равенства с 0x01
, а так как 0xff != 0x01
результат false
.
- то же самое относится к сравнению с boolean
false
, только значение по сравнению с теперь 0x00
.
Я не могу представить ни одной детали реализации, которая привела бы к тому, что false
сравнивалось бы со значением 0xff
при интерпретации bool
. У кого-нибудь есть идеи об этом?