Я прочитал это, и это, похоже, указывает на то, что если я читаю с члена, который не был последним участником, который будет записан, то результатом будет UB ...
MyВопрос в том, почему?
Поскольку в стандарте говорится так: 1 .Стандарт иногда навязывает нам (разработчикам на C ++) правила, которые позволяют реализациям (компиляторам) игнорировать крайние случаи и позволяют оптимизировать их для номинального случая.Это такое правило.
Некоторые компиляторы могут создавать двоичный файл, работающий так, как вы ожидаете.Некоторые могут создать аварийный исполняемый файл.Некоторые могут делать что-то среднее или, казалось бы, случайное. Неопределенное поведение не определено 2 .
1)
В объединении нестатический элемент данных активен, если его имя относится к объекту, срок жизни которого начался и не закончился ([basic.life]).Не более одного из не статических членов-данных объекта типа объединения может быть активным в любое время, то есть значение не более одного из не-статических членов-данных может быть сохранено в объединении в любое время.
и
Аналогично, до начала срока службы объекта, но после хранения, которое объектЗанятость будет выделена или, после окончания срока службы объекта и до повторного использования или освобождения хранилища, в котором занятый объект, может использоваться любое значение glvalue, которое относится к исходному объекту, но только ограниченным образом.[...] Программа имеет неопределенное поведение, если :
- для доступа к объекту используется glvalue, или
- [...]
Чтобы упростить анализ для людей, в следующем контексте:
union { unsigned a; char b[sizeof(unsigned)]; } u;
u.a = 0; // (1)
(void) u.b[0]; // (2) UB
В строке, помеченной (1)
, u.a
теперь является активным членом u
.Согласно [class.union]/1
, поскольку только один нестатический член объединения может быть активным одновременно, u.b
является не активным.
Это означает, что в строке, отмеченной (2)
мы получаем доступ к значению объекта, время жизни которого еще не началось или уже закончилось, что делает его неопределенным поведением по [basic.life]/7
.
2)
неопределенное поведение
поведение, для которого данный документ не предъявляет никаких требований