C 17 的指標型別的強制轉換何解?

時間 2021-05-31 14:34:14

1樓:躺平之王

reinterpret 是對記憶體資料的型別重新解釋,主要用來無關型別轉換,比如指標型別轉成整數,原來4B解釋成位址的現在解釋成整型

static 最常用,進行相關型別的轉換,比如基本型別之間,父類子類之間,void*與其他指標型別。

dynamic 與static對應的,是執行態的轉換,在執行時轉換會進行型別檢查,主要用在父類到子類(指標)的下行轉換,比static好,因為有型別檢查,在轉換失敗時會返回null,但上行轉換兩個是一樣的。

題主的問題個人認為都使用static為好。首先用括號的轉換是 c style,c++加入_cast是出於安全的考量。用reinterpret是殺雞用牛刀。

用dynamic不知道會是什麼結果。。沒用過。google c++ code style約定除非測試不要使用dynamic,因為需要動態判斷型別說明設計上有缺陷

2樓:「已登出」

首先就不推薦用void*

C++17就應該用std::any

static_cast用於型別間有轉換方法的轉換(不應該是unsafe的)

static_cast才是"真正"的轉換

通過呼叫源型別到目標型別的轉換函式或者目標型別的非顯式單個源型別引數的建構函式

真正定義了如何用乙個型別生成另乙個型別

static_cast可用於指標或者引用之間的轉換個人認為完全是C的糟粕

可用是因為C裡規定指標之間可以互相轉換

所以可以視為它們之間有轉換方法

但是個人認為static_cast不應該用於會產生unsafe行為的地方

所以指標或者引用之間就不應該存在轉換方法

因為void*->T*是unsafe的

所以不該用static_cast

dynamic_cast用於所有繼承層級關係間的轉換(不可能是unsafe的)

不管是upcast downcast還是sidecast 都應該用dynamic_cast

網上那些所謂的upcast是安全的所以可以用static_cast都是不太好的理解

dynamic在做upcast的時候同樣沒有執行時開銷

在做downcast和sidecast的時候增加執行時檢測是必要的

因為定義了執行時轉換失敗時的行為所以這就不是乙個unsafe行為而是乙個well-defined行為

如果你能確保乙個轉換在執行時是一定成功的

但是無法在編譯時從繼承層級關係中確保一定成功這仍舊是unsafe的

這種情況為了避免執行時開銷我也建議用reinterpret_cast 而不是static_cast

因為void和T之間很顯然不存在繼承層級關係

所以不能用dynamic_cast

reinterpret_cast用於重新說明資料的型別(一定是unsafe的)

因為void*->T*是unsafe的

所以應該用reinterpret_cast

3樓:SuperSodaSea

T* 轉換為 void* 可以直接隱式轉換,不用寫任何東西;void* 轉換為 T* 使用 static_cast 即可。不用其他幾種的原因:

dynamic_cast:根本過不了編譯。

reinterpret_cast:畫蛇添足了。

在 C 17 中包含陣列的聚合型別如何獲取成員個數

判斷struct unbinding,用這個方法本來就不行。換gcc clang的 擴充套件,把unbinding的stmt轉為expr,在判斷expr合法性即可。 不是很明白,序列化和反序列化的意思,如果你是要計算成員數量的話 包括陣列內 include include include inclu...

如何評價 C 17 之後的 Value Categories 值類別 ?

黃亮anthony 也許不能覆蓋一些特殊的表示式,我一直保持乙個簡單純樸的理解。有名字的表示式是乙個左值 生命週期馬上結束的 臨時變數,函式返回值 左值是xvalue,它也是乙個右值。其它是右值 如果追求準確性,建議背這個張表 https en.cppreference.com w cpp lang...

這個C 寫法是想實現什麼功能,貌似是C 17的語法,能不能為了編譯器相容改成C 11的寫法?

老鹹魚表示。C 11的新內容還是很modern的。右值引用單獨用std move也就硬背了。但是C 17的這些。哎。看得有一種 老語法是屎山,我們新來一套,新舊標準都可,任君選用 的蛋疼感。什麼時候出乙個拋棄C時代語法的C 語言呀。 想實現什麼功能,已經有其他答主回答了,那我就來回答下怎麼改成 C ...