В стандарте 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?