C++20/C++23合规性探讨:从异类型相邻对象指针推导目标指针
从相邻内存的X对象指针推导Y对象指针的标准合规性问题
我们有两个不同类型的对象,它们恰好在内存中相邻存放,示例代码如下:
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();
已知指针x,且明确Y实例在内存中相对于x的位置,是否存在符合C20或C23标准的方法,从x推导出Y实例的指针?
换句话说,以下代码是否符合标准,或者有没有办法让它符合标准:
Y* y = std::launder(reinterpret_cast<Y*>(reinterpret_cast<std::byte*>(x) + sizeof(X))); y->val = 3;
我怀疑这段代码在C20或C23中均不符合标准,理由如下:
- P1839R5文档指出,实际上无法获取指向对象表示的有效指针。
- 即便有P1839R5修订后的指针算术规则,似乎仍然无法从一个对象表示的指针转换到另一个对象表示的指针。
内容的提问来源于stack exchange,提问作者Michael Kourlas
相关产品推荐
相关产品推荐

