Адрес пустого базового оптимизированного подобъекта - PullRequest
0 голосов
/ 06 ноября 2018

Допустим, у меня есть значение:

int i = 0;

И пустой класс, пригодный для оптимизации на пустой основе:

struct Empty{
  // stuff that passes
  // static_assert( std::is_empty<Empty>::value );
 };

Законно ли:

Empty& e = *reinterpret_cast<Empty*>(reinterpret_cast<void*>(&i)); //?
// do stuff with e

1 Ответ

0 голосов
/ 06 ноября 2018

Согласно этому сетевому черновому варианту C ++ , приведение от одного типа указателя к другому и затем обратно указывается условно:

5.2.10 Переосмыслить приведение

(7) Преобразование значения типа «указатель на T1» в тип «указатель» в T2 ”(где T1 и T2 - типы объектов и где выравнивание требования T2 не более строгие, чем требования T1) и обратно к оригинальный тип возвращает исходное значение указателя.

Это означает, что приведение само по себе от int* до Empty* действительно до тех пор, пока Empty не имеет более строгих требований к выравниванию, чем int, и вы можете позже привести к int*.

Обратите внимание, однако, что это не означает, что вы можете получить доступ / разыменовать объект Empty* (так как это не объект Empty, на который указывает указатель).

Таким образом, с чистым приведением все в порядке, но разыменование дает UB.

...