[問題] 什麼時候用 static_cast 而不是dynamic?

作者: lovejomi (JOMI)   2019-02-24 23:19:23
dynamic_cast跟static_cast 對於下轉的差異我基本上了解
但是
基於這個
http://tinyurl.com/y49guge8
https://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-pro-type-static-cast-downcast.html
我看到同事因為這樣而把所有static_cast 全部改成dynamic_cast
導致必須加上 try catch(){ 這邊還補上了assert(false) 強調這件事不該發生}
我想問的是
既然static_cast就是對於下轉 不安全
1. 我有什麼情況下該用(較好)static 而不是dynamic_cast呢?
如果有安全的我幹嘛要用static_cast? 想知道有什麼理由反倒static_cast是更被接受的
https://ideone.com/vam3fi
2. 實際在寫產品的時候
什麼時候"不會" 把base class的 解構子 加上 virtual?
我不能阻止寫code的人 一定不能寫Base* = Derived;
所以一定會補上virtual destructor 來有備無患
但這樣變成 只要不是final class 我解構子都該冠上virtual?
謝謝
作者: loveme00835 (髮箍)   2019-02-24 23:38:00
1. 差別在於需不需要 RTTI, 你要放 ref type 在角括裡, 當然就要加上 try-catch, 但指標轉型只要檢查回傳是不是 nullptr. 2. 你的 class "可以當" base 的時候, 就會透過 virtual dtor 和使用者講這件事, 不然頂多只能當 private base, 這算是一個協定, 懶得寫空的 virtual dtor 就用 = default除非是想透過 dynamic polymorphism 來擴充功能, 這意味著你的 base 裡有 pure virtual function, 不然不太需要這樣寫另外講一個設計問題, 通常 dynamic_cast 變多表示你的設計需要再重新檢視一下, 常見的現象是新增一個類別要改好多地方, 而這些地方都用了 dynamic_caststatic_cast 和 dynamic_cast 有各自的角色, 你會取捨表示還不清楚界線在哪
作者: bluesoul (忙死你老爸)   2019-02-25 09:09:00
只要有多型就該用dynamic cast2的話,簡單說是,都加,不然就是用final
作者: lovejomi (JOMI)   2019-02-25 22:27:00
@loveme: 1. 我比較不懂的是 static_cast不安全既然有安全的 為什麼不用(就算有RTTI又怎樣?)我知道好像可以compile option disable RTTI 但如果enable的情況下, 會想刻意不用RTTI嗎?順帶一問 實務上auto&& = xx; 什麼時候會用auto&&?目前想不到use case
作者: loveme00835 (髮箍)   2019-02-25 22:57:00
所謂的「不安全」指的是「你以爲你知道你在做什麼;實際上卻不是」,而不是「某些東西就是禁忌,用了就是不對」。舉個例子如 LLVM 的 RTTI。auto&& 使用的情境有兩種:作為 r-value ref 或是 forwarding ref,前者用來延長物件 lifetime, 後者保留 arg 值的類型簡單說在你熟悉語言特性以前,寫的每一行都可能不安全
作者: steve1012 (steve)   2019-02-26 06:39:00
rtti 比較expensive. 然後code裡面一堆dynamic cast的確代表你的設計可能很有問題
作者: loveme00835 (髮箍)   2019-02-26 09:04:00
更正: auto&& 都會用於推導型別, 沒有特指 r-value的情形
作者: lovejomi (JOMI)   2019-02-26 09:33:00
auto&&會怎麼樣我很清楚 但我發現沒有使用他的情境 才請教再下一篇想知道有什麼情境用他是最好的 @@另外clang tidy因為有warning,所以再想到底該不該修正這些東西clang應該跟你說的llvm rtti有關係吧

Links booklink

Contact Us: admin [ a t ] ucptt.com