В стандарте c++ в [basic.lval]/11.6 говорится:
Если программа пытается получить доступ к сохраненному значению объекта через glvalue, отличный от одного из следующих типов, поведение не определено: [...]
- агрегатный или объединенный тип, который включает в себя один из вышеупомянутых типов среди своих элементов или нестатических элементов данных (включая, рекурсивно, элемент или нестатический элемент данных субагрегата или содержащего объединения), [...]
Это предложение является частью правила строгого наложения имен.
Позволяет ли нам псевдоним через доступ членов класса?
class A{ //"casted to" aggregate
int i;
float g;
};
int j=10;
int l = reinterpret_cast<A*>(&j)->i;
В соответствии со стандартом доступ к значению объекта возможен только в том случае, если объект подвергается преобразованию lvalue-to-rvalue [conv.lval]/2.
[expr.ref] не предусматривает, что выражение объекта должно ссылаться на объект этого типа, только то, что glvalue должно иметь тип класса (выражение объекта является выражением слева от точки "."). Тем не менее, есть слово, которое периодически появляется в предложении, относящемся к доступу участника, что может означать ограничение для программы, которую я пропустил. Например, [expr.ref]/4.1:
Если E2 является статическим членом данных и тип E2 является T, то E1.E2 является lvalue; выражение обозначает именованный член класса.
Может ли "обозначает" означает, что этот член находится в его жизни, и что я не могу использовать доступ члена класса для псевдонимов perfom? Или это разрешено [basic.lval]/11.6?