Я не могу понять, как это возможно, что мы устанавливаем что-то, и тогда оно не отображается как есть.
Вы спрашиваете, почему это компилируется и даету вас ошибка?
Да, в идеале она должна дать вам ошибку.И это так, если вы используете предупреждения вашего компилятора.В GCC, с -Werror -Wall -pedantic
:
main.cpp: In function 'int main()':
main.cpp:7:15: error: overflow in conversion from 'int' to 'signed char:1'
changes value from '1' to '-1' [-Werror=overflow]
s.enabled = 1;
^
Причины, по которым это оставлено на усмотрение реализации, а не ошибка, могут иметь большее отношение к историческим использованиям, где требование приведения будет означать нарушениестарый кодАвторы стандарта могут полагать, что предупреждений было достаточно, чтобы восполнить слабость тех, кого это касается.
Чтобы добавить некоторый прескриптивизм, я повторю высказывание @ Лундина: "Никогда не используйте битовые поля для любыхцель. " Если у вас есть веские причины для получения низкоуровневых и подробных сведений о разметке памяти, из-за которых вы могли бы подумать, что вам в первую очередь нужны битовые поля, другие связанные с вами требования почти наверняка будут выполненыпротив их занижения.
(TL; DR - если вы достаточно искушены, чтобы законно «нуждаться» в битовых полях, они недостаточно четко определены, чтобы служить вам.)