繁体   English   中英

`std::launder` 未返回 Clang 和 GCC 的正确数据,但适用于 msvc

[英]`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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM