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

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

Ответы [ 2 ]

0 голосов
/ 01 января 2019

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

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

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

0 голосов
/ 01 января 2019

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

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

...