Em sua recente palestra “Type punping in C ++ moderno”, Timur Doumler disse que std::bit_castnão pode ser usado para converter um bit floatem um, unsigned char[4]porque matrizes no estilo C não podem ser retornadas de uma função. Devemos usar std::memcpyou 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::arraycom 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.