3
是相同類型的類型雙胞胎數組,但大小不同仍然違反了嚴格的別名?是相同類型但允許不同大小的類型雙胞胎數組?
int arr[4];
int(&ref)[2] = reinterpret_cast<int(&)[2]>(arr);
arr[0] = 0; //write to original
ref[0]; //read from pun
是相同類型的類型雙胞胎數組,但大小不同仍然違反了嚴格的別名?是相同類型但允許不同大小的類型雙胞胎數組?
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表達可以轉換爲類型「參考 到T2
」如果類型的「指針T1
」一個表達式可以是明確地 轉換爲類型「指針T2
」使用一個reinterpret_cast
。 結果引用與源glvalue相同的對象,但使用指定的類型。
左值或類型「的
N T
陣列」的右值[...]可轉化爲一個 prvalue類型的「指針T
」。 結果是指向數組的第一個元素的指針 。
即,可以說,我們有一個指針指向(不僅僅表示第一個元素的地址)。它是那個元素的類型。因此應該定義訪問ref[0]
。
通過該邏輯,也精寫
auto& ref = reinterpret_cast<unsigned(&)[200]>(arr);
std::cout << ref[0];
相關[IS-重新解釋澆鑄到c樣式陣列非法-C11](http://stackoverflow.com/問題/ 18514490/IS-重新詮釋澆鑄到c樣式陣列非法-C11)。 – Jarod42