4

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.bing现在应该是0

4

0 回答 0