std::launder
有一个先决条件,即从将要返回的指针可到达的所有字节都可以通过传递的指针到达。
我的理解是,这是为了允许编译器优化,例如
struct A {
int a[2];
int b;
};
void f(int&);
int g() {
A a{{0,0},2};
f(a.a[0]);
return a.b;
}
可以优化为始终返回2
。(请参阅指针互转换性与具有相同地址和可以使用 std::launder 将对象指针转换为其封闭数组指针吗?)
这是否意味着可达性前提条件也应该适用于placement-new?否则有什么阻止我写f
如下?:
void f(int& x) {
new(&x) A{{0,0},0};
}
的地址与 的地址a.a[0]
相同,a
并且新A
对象可以透明地替换为旧A
对象,因此a.b
ing
现在应该是0
。