Есть много онлайн -сообщений о старых версиях C ++, не допускающего наказание типа через профсоюзы. Я спросил ChatGTP, изменилось ли это в недавних версиях, и он говорит, что C ++ 20 ослабил это ограничение и, таким образом, позволил каким -либо типам наказания. В частности, для «тривиально копируемых» типов. CHATGTP говорит: < /p>
Соответствующая нормативная формулировка: < /p>
° Class.union.general] (C ++ 20 §11.5.1 /6 В черновике N4868: < /p>
, если союз стандартного содержимого. из них. Читает представление объекта того же размера, что и письменное член. />®class.copy] (C ++ 20 §11.4 /4) определяет тривиально копируемые типы, и это связано с тем, почему тип
Punning Wise Unions работает для них. < /p>
Итак, Safe и стандартный тип профсоюзов: < /p>
, если союз. is permitted, as long as you’re accessing the common initial sequence or
treating the read as accessing the object representation (bit-level copy).
I looked in section 11.5.1 of the C++20 standard (1), it says:
[Note 1 : One special guarantee is made in order Чтобы упростить использование профсоюзов: если союз A
Standard-Layout содержит несколько стандартных структур, которые имеют общую начальную последовательность
(11.4), и если активен нестатический элемент данных объекта этого стандартного типа
и является одним из стандартных структурных структур; Смотрите 11.4. - End Note] < /p>
< /blockquote>
Эта примечание не подтверждает ее для меня, потому что она говорит о структурах в профсоюзах.
Я не стандартный адвокат C ++, так же как и следующее, теперь законно в C ++ 20+: < /p>
enum A : u32 { ... }
enum B : u32 { ... }
union U {
uint32_t i;
A a;
B b;
};
U u;
u.i = 42;
std::cout
Подробнее здесь: https://stackoverflow.com/questions/797 ... gral-types