类型相同但大小不同的双关数组仍然违反严格别名吗?
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 http://eel.is/c++draft/expr.reinterpret.cast#11:
类型的左值表达式T1
可以转换为“引用”类型
到T2
” 如果一个表达式类型为“指向T1
” 可以明确地
转换为“指向的指针”类型T2
“ 用一个reinterpret_cast
.
结果引用与源泛左值相同的对象,但具有指定的类型。
[转换数组] http://eel.is/c++draft/conv.array:
“数组”类型的左值或右值N T
” [...] 可以转换为
“指向的指针”类型的纯右值T
”. 结果是一个指向
数组的第一个元素。
IE。可以说,我们有一个指针points到(不仅仅是代表其地址)第一个元素。它属于该元素的类型。从而访问ref[0]
应该被定义。
按照这个逻辑,写也可以
auto& ref = reinterpret_cast<unsigned(&)[200]>(arr);
std::cout << ref[0];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)