【发布时间】: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
类型双关数组的类型相同但大小不同是否仍然违反严格别名?
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
我们可以这样争论; [expr.reinterpret.cast]/11:
T1类型的泛左值表达式可以转换为“reference”类型 到T2”,如果“指针到T1”类型的表达式可以显式 使用reinterpret_cast转换为“指向T2的指针”类型。 结果引用与源泛泛值相同的对象,但具有指定的类型。
“
N T数组”[…] 类型的左值或右值可以转换为 “指向T的指针”类型的纯右值。 结果是指向 数组的第一个元素。
即可以说,我们有一个指向的指针,它指向(不仅仅是表示)第一个元素的地址。它是那个元素的类型。因此应该定义访问ref[0]。
按这个逻辑,也可以写
auto& ref = reinterpret_cast<unsigned(&)[200]>(arr);
std::cout << ref[0];
【讨论】: