[英]Is it always safe to change a C-style cast to a static_cast?
由於cppcheck cstyleCast樣式警告,我試圖消除代碼庫中的所有C樣式轉換。
將C風格的演員表改為static_cast
總是安全的嗎?
通過安全,我的意思是,是否存在舊的C風格的演員表可以正常工作的情況,但static_cast
會引發錯誤或未定義的行為?
type1 a;
type2 b = (type2)a; // C style cast
type2 b = static_cast<type2>(a); // Is this always a valid replacement for above cast?
C樣式轉換通常是static_cast<>
或reinterpret_cast<>
與const_cast<>
。 使用static_cast<>
替換它可能會產生編譯時錯誤。
我不知道運行時錯誤的任何情況。
您可以從static_cast<>
開始,然后添加(或替換為) const_cast<>
,其中出現編譯時錯誤。 如果之后仍然存在編譯時錯誤,則需要reinterpret_cast<>
。 但是不要盲目地進行替換 - 其中一些可能是錯誤。 例如,如果數據類型是前向聲明但未定義,則可能需要reinterpret_cast<>
,這會導致未指定的行為(如果涉及多個繼承,肯定會導致問題)。
找到這些類型的錯誤是為什么這個練習提高了源代碼的安全性,以及為什么靜態代碼分析器標記C風格的轉換。
C風格的static_cast
和static_cast
不等同。
有沒有舊的C風格的演員可以正常工作的情況,但static_cast會引發錯誤或未定義的行為?
舉個例子:
int main() {
using FI = int(*)();
using FV = void(*)();
FI fi = nullptr;
FV fv = (FV)fi;
//FV fv2 = static_cast<FV>(fi);
}
如果取消注釋使用static_cast
的行,則代碼不會編譯。
作為旁注,在這種情況下,您應該使用reinterpret_cast
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.