隐式对象创建是否会规避std::launder的可达性条件?
关于C++对象内存可达性与隐式对象创建的疑问
我在思考Stack Overflow上的问题《给定两个不同类型的对象及其在内存中的相对位置,能否从一个对象的指针推导出另一个对象的指针?》时,产生了以下疑问。
原优化假设场景
在sizeof(int) == sizeof(float)、alignof(int) == alignof(float)且sizeof(int) == alignof(int)的前提下,我曾认为标准允许编译器将函数g优化为始终返回0:
void f(float*); int g() { alignas(int) std::byte storage[sizeof(int)*2]; auto x = new(storage) float(); auto y = new(storage + sizeof(float)) int(); f(x); return *y; }
理由是受std::launder的可达性前置条件限制,无法从float对象访问到int对象,但目前没有编译器实现该优化。
修改后的f函数场景
如果f的定义如下:
struct A { float x; int y; }; void f(float* x) { reinterpret_cast<A*>(x)->y = 1; }
假设实现中sizeof(A) == 2*sizeof(int)且alignof(A) == alignof(int),此时f的行为是否属于良定义?这会不会导致之前的优化无法进行?
我的思路是:storage生命周期开始时的隐式对象创建可能会生成A对象,其中的int和float对象成为A的成员子对象,且float对象指针与A对象指针可以互相转换。
核心疑问
- 我是否误解了
std::launder可达性前置条件的优化意图? - 还是C++20的隐式对象创建打破了该规则?
- 该可达性条件是否仅适用于非标准布局类型?
另外,我还有一个相关问题:《std::launder 与 placement-new 的可达性条件》
内容的提问来源于stack exchange,提问作者user17732522
相关产品推荐
相关产品推荐

