空基优化子对象的地址



假设我有一个值:

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。

最新更新