reinterpret_cast从对象到第一个成员

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()

int*_*jay 5

是的,因为这里的两个类都是标准布局类型,所以你可以在&b和之间进行转换&b.a.

reinterpret_cast<A*>(p)被定义为与static_cast<A*>(static_cast<void*>(p))(5.2.10p7)相同,所以你的问题都是等价的.

对于标准布局类,struct/class的地址与其第一个非静态成员(9.2p19)的地址相同.并且static_castto/from void*将保留地址(5.2.9p13),这意味着结果将是有效的.

如果类不是标准布局,则不能依赖此行为.

  • 如果编写这样一个疯狂的东西,请确保将static_assert放在两个类is_standard_layout上,以确保在进一步更改的情况下,假设不会被破坏. (2认同)