Неожиданное поведение использования static_cast в структуре с битовыми полямиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неожиданное поведение использования static_cast в структуре с битовыми полями

Сообщение Anonymous »

Следующий код компилируется на std >= C++20, но не компилируется на std < C++20. Это справедливо для msvc, gcc и clang.

Код: Выделить всё

#include 

int main()
{
struct byte
{
unsigned char high : 4;
unsigned char low : 4;
};

unsigned char u = 0xFF;
byte b = static_cast(u);

printf("%d %d", b.high, b.low);

return 0;
}
Независимо от того, выполняется ли статическое приведение во время компиляции или во время выполнения, результат всегда один и тот же:
установлено значение 15
установлено в 0
Независимо от того, насколько велико первое битовое поле или сколько битовых полей следует за ним, только первое битовое поле получает биты из источника static_cast, а все остальные, по-видимому, всегда установлены в 0.
Это очень удивительно для меня, я ожидал, что либо ошибка компиляции, либо все битовые поля будут установлены «правильно».
Почему это так? Это неопределенное поведение (маловероятно, поскольку оно компилируется и запускается во время компиляции) или оно предписано стандартом?

https://godbolt.org/z/z9jnzETsq

Подробнее здесь: https://stackoverflow.com/questions/798 ... bit-fields
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»