簡體   English   中英

將C風格的演員表改為static_cast總是安全的嗎?

[英]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_caststatic_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM