Em sua recente palestra “Type punping in C ++ moderno”, Timur Doumler disse que std::bit_cast
não pode ser usado para converter um bit float
em um, unsigned char[4]
porque matrizes no estilo C não podem ser retornadas de uma função. Devemos usar std::memcpy
ou aguardar até C ++ 23 (ou mais recente) quando algo assim reinterpret_cast<unsigned char*>(&f)[i]
se tornar bem definido.
Em C ++ 20, podemos usar um std::array
com std::bit_cast
,
float f = /* some value */;
auto bits = std::bit_cast<std::array<unsigned char, sizeof(float)>>(f);
em vez de uma matriz de estilo C para obter bytes de um float
?
struct X { unsigned char elems[5]; };
satisfaz a regra que você está citando. Certamente pode ser inicializado em lista com até 4 elementos. Ele pode também ser com 5 elementos inicializado-list. Eu não acho que nenhum implementador de biblioteca padrão odeie pessoas o suficiente para fazer isso, mas acho que é tecnicamente compatível.