Хорошо ли определено использование объединения в любой ревизии C ++? - PullRequest
0 голосов
/ 30 октября 2019

Рассмотрим простое объединение с измененным «активным членом»:

union U {
  int i;
  char *p;
};

U u = { 1 };
u.p = 0;

Есть ли какая-либо ревизия стандарта C ++, которая может правильно определить, что здесь происходит?

В частности, что такое u.p семантически? Это lvalue во время компиляции, , но к чему относится его оценка во время выполнения?

Может ли объект-указатель существовать в u до того, как он будет назначен?

Могут ли объекты существовать до того, как их время жизни даже начнется?

Могут ли два скалярных объекта (различных типов) сосуществовать одновременно по одному и тому же адресу

1 Ответ

2 голосов
/ 31 октября 2019

u.p относится к хранилищу, выделенному для объекта, время жизни которого еще не началось, как разрешено в [basic.life] / 7 : "До времени жизни объектаначалось, но после того, как было выделено хранилище, которое будет занимать объект ... может использоваться любое значение, которое ссылается на исходный объект, но только ограниченным образом. "

Тогда есть специальная магия, с помощью которой присваиваниечлен объединения начинает время жизни объекта:

[class.union] / 5 Когда левый операнд оператора присваивания включает членвыражение доступа ([expr.ref]), которое назначает член объединения, может начинать время жизни этого члена объединения, как описано ниже ...

В выражении присваивания в форме E1 = E2, в котором используется либовстроенный оператор присваивания ([expr.ass]) или тривиальный оператор присваивания ([class.copy.assign]) для каждого элемента X из S(E1), если модификация X будет иметь неопределенное поведение иer [basic.life], объект типа X неявно создается в назначенном хранилище;инициализация не выполняется, и начало его времени жизни определяется после вычисления значения левого и правого операндов и перед присваиванием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...