小编Mic*_*las的帖子

给定两个不同类型的对象及其在内存中的相对位置,我可以从指向另一个对象的指针派生出指向另一个对象的指针吗?

在下面的示例中,我们有两个不同类型的对象,但恰好在内存中彼此相邻。

struct X {
    alignas(long) int val = 1;
};

struct Y {
    long val = 2;
};

[...]

std::byte* buf = new std::byte[sizeof(X) + sizeof(Y)];
X* x = new (buf) X();
new (buf + sizeof(X)) Y();
Run Code Online (Sandbox Code Playgroud)

给定x,以及我们对 的实例Y实际位于内存中相对于 的位置的了解,是否有任何方法可以从符合 C++20 或 C++23 的规范x派生指向 的实例的指针?Yx

换句话说,以下代码是否符合标准,或者是否有任何方法使其符合标准:

Y* y = std::launder(reinterpret_cast<Y*>(reinterpret_cast<std::byte*>(x) + sizeof(X)));
y->val = 3;
Run Code Online (Sandbox Code Playgroud)

我怀疑该代码不符合 C++20 或 C++23 标准,原因如下:

(1) P1839R5表明实际上不可能首先获得指向对象表示形式的可用指针。

(2) 即使考虑到 P1839R5 中修订的指针算术规则,您似乎仍然无法从指向一个对象表示形式的指针转到另一种对象表示形式。

c++ pointers language-lawyer c++20 c++23

8
推荐指数
1
解决办法
268
查看次数

标签 统计

c++ ×1

c++20 ×1

c++23 ×1

language-lawyer ×1

pointers ×1