Адрес пустого базового оптимизированного подобъекта

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

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 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам