[英]`std::launder` not returning correct data for Clang and GCC but is for msvc
当 object 在堆中的堆栈 v 中时,为什么std::launder
在 CLANG 和 GCC 中不返回正确的值 (2)? 甚至使用std::launder
。 std::launder
是必需的。 看到这个说在替换顶级合格的 object const 时需要launder
。 这是因为basic.life不允许替换没有std::launder
的完整 const 对象,只有子对象。
#include <memory>
#include <iostream>
int main()
{
struct X { int n; };
const X *p = new const X{1};
const X x{1};
std::construct_at(&x, X{2}); // on stack
const int c = std::launder(&x)->n;
std::construct_at(p, X{2}); // allocated with new
const int bc = std::launder(p)->n;
std::cout << c << " " << '\n';
std::cout << bc << " " << '\n';
}
请参阅编译器资源管理器。
std::construct_at(&x, X{2});
有未定义的行为。
不允许在之前被const
complete object with automatic, static or thread storage duration占用的存储中创建新的object。 (参见[basic.life]/10 )
除此之外,由于您解释的原因,第二种情况需要std::launder
是正确的:因为您使用new
创建的 object 是const
限定的。 如果不是这样,旧的 object 将可以透明地替换为新的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.