То, что вы пытаетесь сделать здесь с помощью union
, называется типом наказания и является неопределенным поведением в C ++ (вы можете прочитать больше об этом в этом ответе SO ), поэтому работа не гарантируется должным образом.даже на одном и том же компиляторе.
Более того, даже если это разрешено, std::bitset<8>
не гарантирует того же представления, что и std::uint8_t
(а на самом деле его нет ни на одном крупном компиляторе).
В вашем случае вы могли бы просто использовать обычный std::bitset<8>
с методом to_ulong
.
Другая альтернатива - иметь класс-оболочку с элементом bitset, который обеспечивал бы удобные методы для назначения / преобразования вuint8_t
.
Кроме того, если вам нужен только ограниченный API, равный std::bitset<8>
, было бы неплохо (если вы хотите сохранить размер вашего класса в 1 байт), чтобы обернуть вокруг std::uint8_t
и реализовать эти несколько методов (например, test
) вручную.