Dans son récent discours «Type punning en C ++ moderne», Timur Doumler a déclaré que std::bit_cast
cela ne peut pas être utilisé pour convertir un bit float
en un unsigned char[4]
car les tableaux de style C ne peuvent pas être renvoyés d'une fonction. Nous devons utiliser std::memcpy
ou attendre C ++ 23 (ou version ultérieure) lorsque quelque chose comme reinterpret_cast<unsigned char*>(&f)[i]
cela deviendra bien défini.
En C ++ 20, pouvons-nous utiliser un std::array
avec std::bit_cast
,
float f = /* some value */;
auto bits = std::bit_cast<std::array<unsigned char, sizeof(float)>>(f);
au lieu d'un tableau de style C pour obtenir des octets d'un float
?
struct X { unsigned char elems[5]; };
satisfait la règle que vous citez. Il peut certainement être initialisé par liste avec jusqu'à 4 éléments. Il peut également être initialisé par liste avec 5 éléments. Je ne pense pas qu'un implémenteur de bibliothèque standard déteste suffisamment les gens pour le faire, mais je pense que c'est techniquement conforme.