Да.
В соответствии с документом , который описывает поведение std::bit_cast
, и его предлагаемой реализацией , поскольку оба типа имеют одинаковый размер итривиально копируемые, приведение должно быть успешным.
Упрощенная реализация std::bit_cast
должна выглядеть примерно так:
template <class Dest, class Source>
inline Dest bit_cast(Source const &source) {
static_assert(sizeof(Dest) == sizeof(Source));
static_assert(std::is_trivially_copyable<Dest>::value);
static_assert(std::is_trivially_copyable<Source>::value);
Dest dest;
std::memcpy(&dest, &source, sizeof(dest));
return dest;
}
Так как float (4 байта) и массив unsigned char
При size_of(float)
уважении всех этих утверждений, базовое std::memcpy
будет выполнено. Поэтому каждый элемент в результирующем массиве будет одним последовательным байтом с плавающей точкой.
Чтобы доказать это поведение, я написал небольшой пример в Compiler Explorer, который вы можете попробовать здесь: https://godbolt.org/z/4G21zS.Число с плавающей запятой 5.0 правильно хранится в виде массива байтов (Ox40a00000
), который соответствует шестнадцатеричному представлению этого числа с плавающей запятой в Big Endian .