Может ли объект иметь более одного эффективного типа?

Рассмотрим следующий код на платформе, где ABI не вставляет заполнение в объединения:

union { int xi; } x;
x.xi = 1;

Я считаю, что вторая строка демонстрирует неопределенное поведение, поскольку она нарушает строгое правило псевдонимов:

Объект, на который ссылаетсяx.xi тот же объект, что и объект, на который ссылаетсяx, Оба имеют одинаковый регион хранения и срокобъект определено в ISO 9899: 2011 §3.15 как:

объект

1 область хранения данных в среде исполнения, содержимое которой может представлять значения

2 ПРИМЕЧАНИЕ. При ссылке объект может быть интерпретирован как имеющий определенный тип; см. 6.3.2.1.

Поскольку объект является не более чем областью хранения, я заключаю, что какx а такжеx.xi занимают одно и то же хранилище, это один и тот же объект.

эффективный тип изx являетсяunion { int xi; } как это тип, который был объявлен с. См. §6.5 ¶6:

6эффективный Тип объекта для доступа к его хранимому значению является объявленным типом объекта, если таковой имеется.87) Если значение сохраняется в объекте, у которого нет объявленного типа, через lvalue, имеющий тип, который не является символьным типом, то тип lvalue становится эффективным типом объекта для этого доступа и для последующих доступов, которые не изменяют сохраненное значение. Если значение копируется в объект, не имеющий объявленного типа, используяmemcpy или жеmemmoveили копируется как массив символьного типа, тогда эффективный тип модифицированного объекта для этого доступа и для последующих доступов, которые не изменяют значение, является эффективным типом объекта, из которого копируется значение, если оно имеет , Для всех других обращений к объекту, у которого нет объявленного типа, эффективный тип объекта - это просто тип lvalue, используемого для доступа.

87) Выделенные объекты не имеют объявленного типа.

Из формулировки ¶6 также ясно, что каждый объект может иметь только один эффективный тип.

В заявленииx.xi Я получаю доступx через lvaluex.xi набранныйint, Это не один из типов, перечисленных в §6.5-7:

7 Объект должен иметь свое сохраненное значение, доступное только через выражение lvalue, которое имеет один из следующих типов:88)

тип, совместимый с эффективным типом объекта,квалифицированная версия типа, совместимого с эффективным типом объекта,тип, который является типом со знаком или без знака, соответствующим действующему типу объекта,тип, который является типом со знаком или без знака, соответствующим квалифицированной версии действующего типа объекта,агрегатный или объединенный тип, который включает в себя один из вышеупомянутых типов среди своих членов (включая, рекурсивно, член субагрегированного или автономного объединения), илитип персонажа.

88) Цель этого списка - указать те обстоятельства, при которых объект может или не может быть псевдонимом.

Поэтому вторая строка демонстрирует неопределенное поведение.

Поскольку эта интерпретация явно неверна, в чем заключается мое неправильное понимание стандарта?

Ответы на вопрос(2)

Ваш ответ на вопрос