Arn*_*aud 4 c++ type-conversion undefined-behavior reinterpret-cast c++11
我正在看这个答案,我想知道是否使用reinterpret_cast将对象转换为第一个成员并使用结果在C++中是安全的.
假设我们有一个A类,一个B类和一个B的实例b:
class A{
public:
int i;
void foo(){}
};
class B{
public:
A a;
};
B b;
Run Code Online (Sandbox Code Playgroud)
问题1:使用这样的ba是否安全:reinterpret_cast<A*>(&b)->foo()
?
注意:在一般情况下,我们假设类及其成员都是标准布局.
我关于reinterpret_cast的可用引用的讲座告诉我这样的用法应该被授权,因为没有别名违规,但是它与许多答案冲突,比如这个.
问题2:使用这样的ba是否安全:static_cast<A*>(static_cast<void*>(&b))->foo()
?
是的,因为这里的两个类都是标准布局类型,所以你可以在&b
和之间进行转换&b.a
.
reinterpret_cast<A*>(p)
被定义为与static_cast<A*>(static_cast<void*>(p))
(5.2.10p7)相同,所以你的问题都是等价的.
对于标准布局类,struct/class的地址与其第一个非静态成员(9.2p19)的地址相同.并且static_cast
to/from void*
将保留地址(5.2.9p13),这意味着结果将是有效的.
如果类不是标准布局,则不能依赖此行为.