3 回答

TA貢獻1793條經驗 獲得超6個贊
使用static_cast
:它是最精確的演員,它準確地描述了在這里進行的轉換。
有一種誤解,認為使用reinterpret_cast
是一種更好的匹配,因為它意味著“完全忽略類型安全,只是從A轉換為B”。
但是,這實際上并沒有描述a的效果reinterpret_cast
。相反,reinterpret_cast
它具有許多含義,因為所有這些含義都表明“由reinterpret_cast
執行定義執行的映射?!盵5.2.10.3]
但是在特定情況下,從映射void*
到T*
映射完全由標準定義; 即,在不改變其地址的情況下為無類型指針分配類型。
這是一個偏好的理由static_cast
。
此外,并且可以說更重要的是,每次使用reinterpret_cast
都是徹頭徹尾的危險,因為它將任何東西轉換為其他任何東西(指針),同時static_cast
限制性更強,從而提供更好的保護。這已經讓我免于我偶然試圖將一個指針類型強制轉換為另一個指針類型的錯誤。

TA貢獻1806條經驗 獲得超8個贊
這是一個棘手的問題。一方面,Konrad對reinterpret_cast的規范定義提出了一個很好的觀點,盡管在實踐中它可能做同樣的事情。另一方面,如果你在指針類型之間進行轉換(例如,當通過char *在內存中索引時相當常見),static_cast將生成編譯器錯誤,并且無論如何你將被迫使用reinterpret_cast。
在實踐中我使用reinterpret_cast,因為它更能描述強制轉換操作的意圖。您當然可以為不同的運算符設置一個僅指定指針重新解釋的情況(保證返回相同的地址),但標準中沒有一個。

TA貢獻1786條經驗 獲得超13個贊
我建議總是使用最弱的演員。
reinterpret_cast
可用于將指針強制轉換為float
。演員陣容的結構越多,使用它就越需要關注。
在這種情況下char*
,我會使用c風格的演員,直到我們有一些reinterpret_pointer_cast
,因為它更弱,沒有別的就足夠了。
- 3 回答
- 0 關注
- 637 瀏覽
添加回答
舉報