gpt4 book ai didi

c++ - 从对象到第一个成员的 reinterpret_cast

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:30 26 4
gpt4 key购买 nike

我在看这个answer我想知道使用 reinterpret_cast 将对象强制转换为其第一个成员并使用结果在 C++ 中是否安全。

假设我们有一个类 A、一个类 B 和一个 B 的实例 b:

class A{
public:
int i;
void foo(){}
};

class B{
public:
A a;
};

B b;

问题 1:像这样使用 b.a 是否安全:reinterpret_cast<A*>(&b)->foo() ?

注意:在一般情况下,我们假设类及其成员都是标准布局。

我在 reinterpret_cast 上可用引用资料的演讲告诉我这样的使用应该被授权,因为没有别名违规,但是它与许多答案冲突,如 this one .

问题 2:像这样使用 b.a 是否安全:static_cast<A*>(static_cast<void*>(&b))->foo() ?

最佳答案

是的,因为这里的两个类都是standard-layout types , 你可以在 &b 之间转换和 &b.a .

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

对于标准布局类,结构/类的地址与其第一个非静态成员的地址相同 (9.2p19)。和 static_cast往返void*将保留地址 (5.2.9p13),这意味着结果将有效。

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

关于c++ - 从对象到第一个成员的 reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30617519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com