gpt4 book ai didi

c++ - 为什么这个 std::launder 示例是未定义的行为?

转载 作者:行者123 更新时间:2023-12-01 12:59:08 25 4
gpt4 key购买 nike

这是我不明白的示例部分:

struct Y
{
int z;
};
int main()
{
alignas(Y) std::byte s[sizeof(Y)];
Y *q = new (&s) Y{2};
const int f = reinterpret_cast<Y *>(&s)->z; // Class member access is undefined behavior:
// reinterpret_cast<Y*>(&s) has value "pointer to s"
// and does not point to a Y object
}

整个示例位于 https://en.cppreference.com/w/cpp/utility/launder .

我不明白为什么使用 reinterpret_cast<Y *>(&s)->z是未定义的行为。我们已经在所谓的“指向s的指针”处构造了一个Y对象,并将其重新解释为 Y* ,那么为什么它仍然说“它不指向 Y 对象”?

最佳答案

&s是指向 std::byte[sizeof(Y)] 的指针,不是 Y .这意味着使用 &s作为 Y*是未定义的行为,因为它违反了别名规则。即使有 Y住在那里,rules of reinterpret_cast (特别是类型别名部分)不允许您访问该对象,因为它不知道那里实际上有一个对象。
std::launder被引入是为了明确允许您将返回的指针视为指向对象的有效指针,而不是指向对象所在存储的指针。本质上,它是类型别名规则的显式覆盖。你用它告诉编译器你知道指针确实指向一个有效的对象,如果你撒谎,那么你又回到了未定义的行为领域。

关于c++ - 为什么这个 std::launder 示例是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60870560/

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