std::launder 与放置 - 新的可达性条件

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