Если объект x
будет правильно инициализирован, операторы if
в main()
будут допустимыми, поскольку, несмотря на следующее ограничение в пункте [class.union]/1
стандарта C ++:
1) В объединении нестатический элемент данных активен, если его имя относится к объекту, время жизни которого началось и не закончилось. Не более одного члена нестатических данных объекта объединенного типа может быть активным в любое время , то есть значение не более одного из нестатических данныхчлены могут быть сохранены в объединении в любое время.
следующее исключение позволяет получить доступ к общему члену type
:
Одна специальная гарантия предоставляется в заказедля упрощения использования объединений: если объединение стандартной компоновки содержит несколько структур стандартной компоновки, которые совместно используют общую начальную последовательность , и если нестатический элемент данных объекта этого типа объединения стандартной компоновкиявляется активным и является одной из структур стандартной компоновки, разрешено проверять общую начальную последовательность любых элементов структуры стандартной компоновки.
Но проблема в вашем фрагменте состоит в том, что вы создаете объект объединения x
без активации какого-либо из его членов ([basic.life]
/ 1.2):
(...) если объект является членом объединения или его подобъектом, время его жизни начинается только в том случае, если этот член объединения является инициализированным членом объединения
Это означает, что некоторые данные считываются непосредственно в объединениеобъект, когда ни один член не активен, так что все еще ни один член не активен.Строго следуя стандарту, я бы понял, что это совсем не гарантировано.
Правильный способ сделать это - прочитать type
, затем инициализировать соответствующий член и прочитать в нем остальную часть структуры (или прочитать все в буфер и скопировать, следуя аналогичной стратегии),Однако на практике ваш код будет работать на большинстве компиляторов.