C++ 空基优化子对象的地址
假设我有一个值:C++ 空基优化子对象的地址,c++,template-meta-programming,void-pointers,is-empty,void-safety,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 wi
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
根据这一点,从一个指针类型到另一个指针类型再向后转换是有条件有效的:
5.2.10重新解释铸件
7将“指针到T1”类型的PRV值转换为“指针”类型
至T2”,其中T1和T2为对象类型,路线
T2的要求并不比T1的要求更严格,并回到its
原始类型生成原始指针值
这意味着,从int*到Empty*的转换本身是有效的,只要Empty没有比int更严格的对齐要求,您可以稍后再转换回int*
但是,请注意,这并不意味着您可以访问/取消引用空*-对象,因为它不是指针指向的空对象
因此,纯强制转换是可以的,但是取消引用它会产生UB。根据这一点,从一个指针类型到另一个指针类型再返回的强制转换是有条件有效的:
5.2.10重新解释铸件
7将“指针到T1”类型的PRV值转换为“指针”类型
至T2”,其中T1和T2为对象类型,路线
T2的要求并不比T1的要求更严格,并回到its
原始类型生成原始指针值
这意味着,从int*到Empty*的转换本身是有效的,只要Empty没有比int更严格的对齐要求,您可以稍后再转换回int*
但是,请注意,这并不意味着您可以访问/取消引用空*-对象,因为它不是指针指向的空对象
所以纯cast是可以的,但是取消引用它会产生UB。Empty*不允许别名为整数,所以我会说不。@swardfish int是一个偶然的问题。它可以是什么类型,以便Empty*可以为它添加别名?如果您不希望它只是作为解释严格别名的帖子的副本关闭,为什么不回顾一下您正在尝试实现的目标呢?这有点像XY问题。@tsuki,请你自己读一读:如果e是空的,你能用它做什么?empty*不允许别名为整数,所以我说不。@Swardfish int是个意外的问题。它可以是什么类型,以便Empty*可以为它添加别名?如果您不希望它只是作为解释严格别名的帖子的副本关闭,为什么不回顾一下您正在尝试实现的目标呢?这有一种XY问题的感觉。@tsuki,请你自己阅读:如果e是空的,你能用它做什么?