空的基础优化子对象的地址

时间:2018-11-06 08:21:02

标签: c++ template-meta-programming void-pointers is-empty void-safety

假设我有一个价值:

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 :(得分:5)

根据此online C++ standard draft,从一种指针类型到另一种指针类型然后再返回的转换在条件上是有效的:

  

5.2.10重新解释演员表

     

(7)将“ pointer to T1”类型的prvalue转换为“ pointer”类型   到T2”(其​​中T1和T2是对象类型,并且对齐方式   T2的要求不比T1的要求严格,并回到其   原始类型产生原始指针值。

这意味着,只要int*的对齐要求不比Empty*严格,则从Emptyint的转换本身就是有效的,并且您以后可以投射回int*

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

所以纯类型转换是可以的,但是取消引用它会产生UB。