W swoim ostatnim przemówieniu „Pisanie czcionek we współczesnym C ++” Timur Doumler powiedział, że std::bit_cast
nie można go użyć do wrzucenia a float
do, unsigned char[4]
ponieważ tablice w stylu C nie mogą zostać zwrócone z funkcji. Powinniśmy albo użyć, std::memcpy
albo poczekać, aż C ++ 23 (lub nowszy), kiedy coś takiego reinterpret_cast<unsigned char*>(&f)[i]
zostanie dobrze zdefiniowane.
W C ++ 20, możemy użyć std::array
z std::bit_cast
,
float f = /* some value */;
auto bits = std::bit_cast<std::array<unsigned char, sizeof(float)>>(f);
zamiast tablicy w stylu C, aby uzyskać bajty float
?
struct X { unsigned char elems[5]; };
spełnia regułę, którą przytaczasz. Z pewnością można go zainicjować listą z maksymalnie 4 elementami. Można go również zainicjować listą z 5 elementami. Nie sądzę, żeby jakikolwiek standardowy implementator biblioteki nienawidził ludzi wystarczająco, by to zrobić, ale myślę, że jest to technicznie zgodne.