Объединенная общая начальная последовательность с примитивным
Я пытаюсь лучше понять довольно удивительное открытие относительно союзов и общее правило начальной последовательности. Общее правило начальной последовательности говорит (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. Это просто не имеет никакого смысла для меня вообще; компилятор интуитивно по крайней мере ограничен с примитивным типом, как с классом. Если это преднамеренно, есть ли какие-либо рифмы или причины (возможно, связанные с выравниванием), почему это имеет смысл? Возможно, это дефект?