use*_*522 6 c++ placement-new language-lawyer stdlaunder
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;
}
Run Code Online (Sandbox Code Playgroud)
可以优化为始终返回2。(请参阅指针可互换性与具有相同地址和能否使用 std::launder 将对象指针转换为其封闭数组指针?)
这是否意味着可达性先决条件也应该适用于placement-new?否则有什么阻止我写f如下吗?:
void f(int& x) {
new(&x) A{{0,0},0};
}
Run Code Online (Sandbox Code Playgroud)
的地址与 的地址a.a[0]相同,a并且新A对象可以透明地替换为旧A对象,因此a.bing现在应该是0。