std::launder
函数要求通过结果可以访问的每个字节都可以通过参数访问。如果一个指向对象Y的指针值可以到达存储器中的一个字节,那么该存储器中的字节就是可到达的。如果Y是一个数组元素,则可到达的是它所占用的存储器或与Y可互换指针的对象。根据另一个问题的答案,该限制意味着“你不能使用launder
获取一个指针,使你能够访问比源指针值允许的更多字节,否则会导致未定义行为。”这对于T.C.提供的例子是有道理的,但我不明白如何解释在原始对象被替换为新对象的情况下,这是std::launder
最初考虑的目的。标准有以下示例:struct X { const int n; };
X *p = new X{3};
const int a = p->n;
new (p) X{5}; // p does not point to new object (6.8) because X::n is const
const int b = p->n; // undefined behavior
const int c = std::launder(p)->n; // OK
- 我是否理解有误,或者措辞存在问题?
- 什么是预期的含义,使得该示例有效?
在这种情况下,当调用std::launder
时,原始的X
对象指向的对象p
已经不存在了,因为在占用它的存储空间中创建新对象已经隐式结束其生命周期([basic.life]/1.4)。因此,似乎没有任何字节可以通过p
访问,因为p
没有指向任何对象Y。显然,这不是预期的解读,因为这会使示例中对std::launder
的调用成为未定义的行为。