【问题标题】:Is type punning arrays of same type but different size allowed?是否允许类型相同但大小不同的双关数组?
【发布时间】:2016-07-03 05:42:29
【问题描述】:

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

int arr[4];
int(&ref)[2] = reinterpret_cast<int(&)[2]>(arr);

arr[0] = 0; //write to original
ref[0]; //read from pun

【问题讨论】:

标签: c++ arrays language-lawyer type-punning


【解决方案1】:

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

T1 类型的泛左值表达式可以转换为“reference”类型 到T2”,如果“指针到T1”类型的表达式可以显式 使用reinterpret_cast 转换为“指向T2 的指针”类型。 结果引用与源泛泛值相同的对象,但具有指定的类型。

[conv.array]:

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

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

按这个逻辑,也可以写

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 2014-07-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多