空基优化子对象的地址

tsu*_*uki 1 c++ void-pointers is-empty template-meta-programming void-safety

假设我有一个值:

int i = 0;
Run Code Online (Sandbox Code Playgroud)

并且有资格进行空基优化的空类:

struct Empty{
  // stuff that passes
  // static_assert( std::is_empty<Empty>::value );
 };
Run Code Online (Sandbox Code Playgroud)

是否合法:

Empty& e = *reinterpret_cast<Empty*>(reinterpret_cast<void*>(&i)); //?
// do stuff with e
Run Code Online (Sandbox Code Playgroud)

Ste*_*ner 5

根据这个在线C++标准草案,从一个指针类型到另一个指针类型的转换然后返回条件有效:

5.2.10重新解释演员

(7)将"指向T1的指针"的prvalue转换为"指向T2的指针"类型(其中T1和T2是对象类型,T2的对齐要求不比T1更严格)并返回其原始类型产生原始指针值.

这意味着,自投本身int*Empty*是只要有效Empty并不比严格对齐要求int,并且以后可以转换回int*.

但请注意,这并不意味着您可以访问/取消引用Empty*-object(因为它不是Empty指针所指向的对象).

所以纯粹的演员阵容是可以的,但是取消引用它然后产生UB.