В своем недавнем выступлении « Обработка типов в современном C ++» Тимур Думлер сказал, что std::bit_cast
его нельзя использовать для float
преобразования битов в unsigned char[4]
массив, потому что массивы в стиле C не могут быть возвращены из функции. Мы должны либо использовать, std::memcpy
либо подождать до C ++ 23 (или позже), когда что-то вроде reinterpret_cast<unsigned char*>(&f)[i]
станет хорошо определенным.
В C ++ 20, мы можем использовать std::array
с std::bit_cast
,
float f = /* some value */;
auto bits = std::bit_cast<std::array<unsigned char, sizeof(float)>>(f);
вместо массива в стиле C, чтобы получить байты float
?
struct X { unsigned char elems[5]; };
удовлетворяет правило, которое вы цитируете. Конечно, он может быть инициализирован до 4 элементов. Это может также быть инициализировано списком с 5 элементами. Я не думаю, что какой-либо разработчик стандартной библиотеки ненавидит людей настолько, чтобы это делать, но я думаю, что это технически соответствует.