Не получает 1 при касте в bool - PullRequest
1 голос
/ 11 июля 2019

У меня есть следующий код:

#include <iostream>

void f(void* buffer) {
    int x = static_cast<bool>(*(char*)buffer);
    int y = static_cast<bool>(*(bool*)buffer);
    std::cout << x << " " << y;
}

int main() {
    int a = 255;
    f(&a);
}

На GCC 9.1 я получаю следующий вывод:

1 255

Почему приведение к bool с (char*) приводит к тому, что x равно 1, а приведение к bool с (bool*) приводит к y, в данном случае 255?

Ответы [ 2 ]

5 голосов
/ 11 июля 2019

Почему приведение к bool ... с результатами (bool *) ...?

Поскольку поведение программы не определено.

Стандартговорит (цитируя последний черновик):

[basic.lval]

Если программа пытается получить доступ к сохраненному значению объекта через glvalue, тип которого не похож ([conv.qual]) к одному из следующих типов поведение не определено :

  • динамический тип объекта,
  • тип со знакомили тип unsigned, соответствующий динамическому типу объекта, или
  • тип char, unsigned char или std :: byte.

bool не похождля динамического типа buffer, это не unsigned и не unsigned соответствующий тип, а также char unsigned char или std::byte.Поэтому поведение не определено.

Почему приведение к bool с (char *) приводит к тому, что x равен 1

Поскольку первый байт a содержит значениеэто не представляет ноль.Будет ли это так, зависит от архитектуры процессора.Порядок байтов целого числа определяется реализацией.

Обратите внимание, что в этом случае поведение будет хорошо определено, поскольку char указано как одно из исключений в указанном правиле.

1 голос
/ 11 июля 2019

Вам нужно использовать reinterpret_cast<int *>. Например

int y = static_cast<bool>(*reinterpret_cast<int*>( buffer ));

Вот демонстрационная программа

#include <iostream>

int main()
{
    int x = 255;
    void *buffer = &x;
    int y = static_cast<bool>(*reinterpret_cast<int*>( buffer ));

    std::cout << y << '\n';
}
...