2012-09-05 44 views
9

這是轉換型安全是重新解釋從指針向量矢量的const指針安全嗎?

vector<int*> a; 
const vector<const int*>& b = reinterpret_cast<const vector<const int*>&>(a); 

靜態澆鑄顯然不工作在這種情況下,因爲模板參數發生變化。但通過這樣做重新解釋演員,我只是將常量添加到基本相同的類型。那麼這對所有的實際目的都應該是安全的嗎?

+2

其中一種可能實際出錯的方法(儘管我沒有通過測試證實)是嚴格的別名。優化器有權假定'b'不是指與'a'相同的內存(因爲它的類型與別名不兼容)。然後優化器會發揮它的技巧,並且你可能會發現它重新命令或者忽略了它不會重新排序的東西,或者如果'a'和'b' *有效地引用同一個內存,它就會不會重新排序或者退出。因此,相同的佈局是它「工作」的必要條件,但不是一個充分條件。 –

+1

另一種看待它的方式是,對參考或指針類型的'reinterpret_cast'的結果基本上*無用,除了轉換回原始類型之外不適用於其他任何東西,除非(a)目標類型對於實際類型的別名是合法的,或者(b)你的實現有一些特別的保證,它支持你正在做的特定事情。當兩者都不適用時,不要通過任何其他類型的對象來引用對象。這樣做也被稱爲「打字」。 –

回答

7

像使用reinterpret_cast將引用轉換爲不相關類型一樣,它給出了未定義的行爲,所以除非將「safe」定義爲「適用於我的編譯器」,否則不安全。

+0

假設任何指針的向量都是相同的結構,不管它們是否只是地址,都不是沒問題的。或者結構實際上可能因指針的類型而改變。 – user1353535

+3

@ user1353535:不,庫實現可以自由地專門化模板,但它喜歡。不要求不同的專業化版本兼容。 –

+0

因此,如果它的用戶定義的類型,庫不可能專精,然後呢? – user1353535