У своїй нещодавній бесіді «Тип покарання в сучасному C ++» Тимур Домлер сказав, що std::bit_cast
його неможливо використати для введення біт float
в «a», 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);
замість масиву в стилі С, щоб отримати байти float
?
struct X { unsigned char elems[5]; };
відповідає правилу, яке ви цитуєте. Це, безумовно, може бути ініціалізовано список з до 4 елементами. Він також може бути ініціалізований у списку з 5 елементами. Я не думаю, що будь-який стандартний виконавець бібліотеки ненавидить людей достатньо, щоб насправді це зробити, але я думаю, що це технічно відповідає.