gpt4 book ai didi

c++ - 是否将正确对齐和大小的数组转换和访问到未构造的平凡类型未定义行为?

转载 作者:行者123 更新时间:2023-12-04 14:05:11 25 4
gpt4 key购买 nike

下面的代码是否定义明确?

struct S { int x; };
alignas(alignof(S)) char c_arr[sizeof(S)];
S *s_ptr = (S*)c_arr;
s_ptr->x = 5; // UB or not UB?

注意:S 有意定义为 Trivial Type .

如果我们通过添加一个只将 X 设置为某个任意值而不通过 placement new 调用它的构造函数来使类型变得非常重要,情况会发生变化吗?

这个问题不同于this问题,因为它不使用 malloc 并且也询问非平凡的类型。

最佳答案

Is the following code well defined?

没有。它违反了所谓的 strict aliasing rule .

你必须清洗指针:

S *s_ptr = std::launder(reinterpret_cast<S*>(c_arr));
s_ptr->x = 5; // not UB

在接受提案之前 P0593R6 , 洗钱是不够的。相反,过去需要使用 placement-new 显式创建对象。当重新解释的类型不是“隐式生命周期类型”时,这仍然是必要的。

关于c++ - 是否将正确对齐和大小的数组转换和访问到未构造的平凡类型未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68778150/

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