假设我有一个值:
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( 将"pointer to T1"类型的prvalue转换为"pointer到T2"(其中T1和T2是对象类型,其中对齐T2的要求并不比T1严格(原始类型产生原始指针值。
这意味着,从int*
到Empty*
的强制转换本身是有效的,只要Empty
没有比int
更严格的对齐要求,并且以后可以强制转换回int*
。
但是,请注意,这并不意味着您可以访问/取消引用Empty*
-对象(因为它不是指针指向的Empty
-对象(。
所以纯cast是可以的,但是取消引用它会产生UB。