Можем ли мы получить доступ к члену несуществующего объекта типа класса? - программирование

Можем ли мы получить доступ к члену несуществующего объекта типа класса?

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

4b9b3361

Ответ 1

Для нестатического члена данных слово:

Если E2 является нестатическим членом данных, а тип E1 - "cq1 vq1 X", а тип E2 - "cq2 vq2 T", выражение обозначает именованный член объекта, обозначенный первым выражением.

Понятно, что объект, обозначенный *reinterpret_cast<A*>(&j), т. j, не имеет члена, поэтому поведение не определяется пропуском.

Ответ 2

Редактировать: После долгого разговора с людьми, которые знают лучше меня, напрашивается вывод: это "поведение".

Но кого это волнует? Это ужасная практика в любом случае.