首页 > 解决方案 > 是否将正确对齐和大小的数组转换为未构造的 Trivial Type 未定义行为?

问题描述

以下代码是否定义明确?

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 设置为任意值而不通过放置 new 调用它的构造函数来使类型变得无关紧要,情况会改变吗?

这个问题与这个问题不同,因为它不使用 malloc 并且还询问非平凡类型。

标签: c++undefined-behavior

解决方案


以下代码是否定义明确?

不,它违反了所谓的严格别名规则

您必须清洗指针:

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

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


推荐阅读