Объединенная общая начальная последовательность с примитивным

Я пытаюсь лучше понять довольно удивительное открытие относительно союзов и общее правило начальной последовательности. Общее правило начальной последовательности говорит (class.mem 23):

В объединении стандартного макета с активным членом типа структуры T1 разрешено читать нестатический элемент данных m другого члена объединения типа структуры T2, если m является частью общей начальной последовательности T1 и Т2; поведение такое, как если бы был назначен соответствующий член T1.

Итак, учитывая:

struct A {
  int a;
  double x;
};

struct B {
  int b;
};

union U {
  A a;
  B b;
};

U u;
u.a = A{};
int i = u.b.b;

Это определено поведение, а i должно иметь значение 0 (поскольку A и B имеют CIS из своего первого члена, int). Все идет нормально. Путаница заключается в том, что если B заменить просто int:

union U {
  A a;
  int b;
};

...
int i = u.b;

В соответствии с определением общей исходной последовательности:

Общая начальная последовательность двух типов структуры стандартного макета...

Таким образом, CISs могут применяться только между двумя стандартными структурами. И в свою очередь:

Структура стандартного макета - это класс стандартного макета, определенный с помощью структуры класса или класса класса.

Итак, примитивный тип очень определенно не квалифицируется; то есть он не может иметь СНГ ни с чем, поэтому A не имеет СНГ с int. Поэтому в стандарте говорится, что первым примером является поведение, а второе - UB. Это просто не имеет никакого смысла для меня вообще; компилятор интуитивно по крайней мере ограничен с примитивным типом, как с классом. Если это преднамеренно, есть ли какие-либо рифмы или причины (возможно, связанные с выравниванием), почему это имеет смысл? Возможно, это дефект?

Ответы