假设我有一个值:
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
假设我有一个值:
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
根据这个在线 C++ 标准草案,从一种指针类型转换为不同的指针类型然后返回是有条件的:
5.2.10 重新解释演员表
(7) 将“指向 T1 的指针”类型的纯右值转换为“指向 T2 的指针”类型(其中 T1 和 T2 是对象类型,并且 T2 的对齐要求不比 T1 严格)并返回其原始类型产生原始指针值。
这意味着,只要没有比 更严格的对齐要求,从int*
to的转换本身就是有效的,并且您可以稍后再转换回。Empty*
Empty
int
int*
但是请注意,这并不意味着您可以访问/取消引用Empty*
-object(因为它不是Empty
指针指向的 -object)。
所以纯粹的演员是可以的,但是取消引用它会产生UB。