gpt4 book ai didi

c++ - 在标准布局对象(例如,使用 offsetof)中进行指针运算时,我们是否需要使用 std::launder?

转载 作者:IT老高 更新时间:2023-10-28 12:54:46 31 4
gpt4 key购买 nike

此问题是对 Is adding to a "char *" pointer UB, when it doesn't actually point to a char array? 的后续问题。

CWG 1314 , CWG 确认使用 unsigned char 指针在标准布局对象中执行指针运算是合法的。这似乎意味着类似于链接问题中的一些代码应该按预期工作:

struct Foo {
float x, y, z;
};

Foo f;
unsigned char *p = reinterpret_cast<unsigned char*>(&f) + offsetof(Foo, z); // (*)
*reinterpret_cast<float*>(p) = 42.0f;

(为了更清楚,我已将 char 替换为 unsigned char。)

然而,C++17 中的新变化似乎暗示这段代码现在是 UB,除非在两个 reinterpret_cast 之后都使用了 std::launder。两个指针类型之间的 reinterpret_cast 的结果等价于两个 static_cast:第一个到 cv void* ,第二个指向目标指针类型。但是 [expr.static.cast]/13 意味着这会产生一个指向原始对象的指针,而不是目标类型的对象,因为 Foo 类型的对象不能与unsigned char 对象在其第一个字节,也不是 unsigned char 对象在 f.z 的第一个字节指针与 f.z 本身。

我很难相信委员会打算做出改变来打破这个非常常见的习语,使 offsetof 的所有 C++17 之前的用法都未定义。

最佳答案

你的问题是:

Do we need to use std::launder when doing pointer arithmetic within a standard-layout object (e.g., with offsetof)?

没有。

std::launder 在这种情况下不会更改任何内容,因此与所提供的示例无关(imo 编辑 launder 问题或问另一个问题)。

std::launder 通常只需要在您更改(或创建)底层对象的情况子集(例如,由于 const 成员)一些 runtime 方式(例如,通过放置 new)。助记符:对象“脏”,需要std::launder

仅使用标准布局类型不会导致您需要使用 std::launder。

关于c++ - 在标准布局对象(例如,使用 offsetof)中进行指针运算时,我们是否需要使用 std::launder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55578429/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com