是否允许相同类型但大小不同的类型双关数组

Is type punning arrays of same type but different size allowed?

本文关键字:类型 数组 许相 同类型 是否      更新时间:2023-10-16
相同

类型但大小不同的类型双关数组是否仍然违反严格混叠?

int arr[4];
int(&ref)[2] = reinterpret_cast<int(&)[2]>(arr);
arr[0] = 0; //write to original
ref[0]; //read from pun

我们可以这样争论;[expr.reinterpret.cast]/11:

类型T1的glvalue表达式可以转换为类型"引用" 如果可以显式地将"指向T1的指针"类型的表达式T2 使用reinterpret_cast转换为类型"指向T2的指针"。 结果引用与源 glvalue 相同的对象,但具有指定的类型。

[转换阵列]:

类型为"N T数组"的左值或右值 [...]可以转换为 "指向T的指针"类型的 PR值。结果是指向 数组的第一个元素。

也就是说,我们可以说,我们有一个指向(而不仅仅是表示)第一个元素的地址的指针。它是该元素的类型。因此,应定义访问ref[0]

按照这个逻辑,写也没问题

auto& ref = reinterpret_cast<unsigned(&)[200]>(arr);
std::cout << ref[0];