1

假设我有一个值:

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
4

1 回答 1

5

根据这个在线 C++ 标准草案,从一种指针类型转换为不同的指针类型然后返回是有条件的:

5.2.10 重新解释演员表

(7) 将“指向 T1 的指针”类型的纯右值转换为“指向 T2 的指针”类型(其中 T1 和 T2 是对象类型,并且 T2 的对齐要求不比 T1 严格)并返回其原始类型产生原始指针值。

这意味着,只要没有比 更严格的对齐要求,从int*to的转换本身就是有效的,并且您可以稍后再转换回。Empty*Emptyintint*

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

所以纯粹的演员是可以的,但是取消引用它会产生UB。

于 2018-11-06T08:37:21.163 回答