Подтвердить что ты не робот

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

4b9b3361

Ответ 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. У кого-нибудь есть идеи об этом?