2016-03-17 52 views
3

是相同類型的類型雙胞胎數組,但大小不同仍然違反了嚴格的別名?是相同類型但允許不同大小的類型雙胞胎數組?

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

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

相關[IS-重新解釋澆鑄到c樣式陣列非法-C11](http://stackoverflow.com/問題/ 18514490/IS-重新詮釋澆鑄到c樣式陣列非法-C11)。 – Jarod42

回答

1

我們可以這樣說: [expr.reinterpret.cast]/11

T1類型的glvalue表達可以轉換爲類型「參考 到T2」如果類型的「指針T1」一個表達式可以是明確地 轉換爲類型「指針T2」使用一個reinterpret_cast結果引用與源glvalue相同的對象,但使用指定的類型。

[conv.array]

左值或類型「的N T陣列」的右值[...]可轉化爲一個 prvalue類型的「指針T」。 結果是指向數組的第一個元素的指針 。

即,可以說,我們有一個指針指向(不僅僅表示第一個元素的地址)。它是那個元素的類型。因此應該定義訪問ref[0]

通過該邏輯,也精寫

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