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

看板C_and_CPP (C/C++)作者 (JOMI)時間7年前 (2019/02/24 23:19), 編輯推噓1(1038)
留言39則, 4人參與, 7年前最新討論串1/1
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? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 27.52.3.23 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1551021569.A.F0C.html

02/24 23:38, 7年前 , 1F
1. 差別在於需不需要 RTTI, 你要放 ref type 在角括
02/24 23:38, 1F

02/24 23:39, 7年前 , 2F
裡, 當然就要加上 try-catch, 但指標轉型只要檢查回
02/24 23:39, 2F

02/24 23:41, 7年前 , 3F
傳是不是 nullptr. 2. 你的 class "可以當" base 的
02/24 23:41, 3F

02/24 23:41, 7年前 , 4F
時候, 就會透過 virtual dtor 和使用者講這件事, 不
02/24 23:41, 4F

02/24 23:42, 7年前 , 5F
然頂多只能當 private base, 這算是一個協定, 懶得寫
02/24 23:42, 5F

02/24 23:42, 7年前 , 6F
空的 virtual dtor 就用 = default
02/24 23:42, 6F

02/24 23:44, 7年前 , 7F
除非是想透過 dynamic polymorphism 來擴充功能, 這
02/24 23:44, 7F

02/24 23:45, 7年前 , 8F
意味著你的 base 裡有 pure virtual function, 不然
02/24 23:45, 8F

02/24 23:46, 7年前 , 9F
不太需要這樣寫
02/24 23:46, 9F

02/24 23:56, 7年前 , 10F
另外講一個設計問題, 通常 dynamic_cast 變多表示你
02/24 23:56, 10F

02/24 23:57, 7年前 , 11F
的設計需要再重新檢視一下, 常見的現象是新增一個類
02/24 23:57, 11F

02/24 23:57, 7年前 , 12F
別要改好多地方, 而這些地方都用了 dynamic_cast
02/24 23:57, 12F

02/25 00:00, 7年前 , 13F
static_cast 和 dynamic_cast 有各自的角色, 你會取
02/25 00:00, 13F

02/25 00:00, 7年前 , 14F
捨表示還不清楚界線在哪
02/25 00:00, 14F

02/25 09:09, 7年前 , 15F
只要有多型就該用dynamic cast
02/25 09:09, 15F

02/25 09:09, 7年前 , 16F
2的話,簡單說是,都加,不然就是用final
02/25 09:09, 16F

02/25 22:27, 7年前 , 17F
@loveme: 1. 我比較不懂的是 static_cast不安全
02/25 22:27, 17F

02/25 22:27, 7年前 , 18F
既然有安全的 為什麼不用(就算有RTTI又怎樣?)
02/25 22:27, 18F

02/25 22:27, 7年前 , 19F
我知道好像可以compile option disable RTTI 但如果
02/25 22:27, 19F

02/25 22:28, 7年前 , 20F
enable的情況下, 會想刻意不用RTTI嗎?
02/25 22:28, 20F

02/25 22:29, 7年前 , 21F
順帶一問 實務上auto&& = xx; 什麼時候會用auto&&?
02/25 22:29, 21F

02/25 22:29, 7年前 , 22F
目前想不到use case
02/25 22:29, 22F

02/25 22:57, 7年前 , 23F
所謂的「不安全」指的是「你以爲你知道你在做什麼;
02/25 22:57, 23F

02/25 22:57, 7年前 , 24F
實際上卻不是」,而不是「某些東西就是禁忌,用了就
02/25 22:57, 24F

02/25 22:57, 7年前 , 25F
是不對」。舉個例子如 LLVM 的 RTTI。auto&& 使用的
02/25 22:57, 25F

02/25 22:57, 7年前 , 26F
情境有兩種:作為 r-value ref 或是 forwarding ref,
02/25 22:57, 26F

02/25 22:57, 7年前 , 27F
前者用來延長物件 lifetime, 後者保留 arg 值的類型
02/25 22:57, 27F

02/25 23:15, 7年前 , 28F
簡單說在你熟悉語言特性以前,寫的每一行都可能不安
02/25 23:15, 28F

02/25 23:15, 7年前 , 29F
02/25 23:15, 29F

02/26 06:39, 7年前 , 30F
rtti 比較expensive. 然後code裡面一堆dynamic cast
02/26 06:39, 30F

02/26 06:39, 7年前 , 31F
的確代表你的設計可能很有問題
02/26 06:39, 31F

02/26 09:04, 7年前 , 32F
更正: auto&& 都會用於推導型別, 沒有特指 r-value
02/26 09:04, 32F

02/26 09:04, 7年前 , 33F
的情形
02/26 09:04, 33F

02/26 09:33, 7年前 , 34F
auto&&會怎麼樣我很清楚 但我發現沒有使用他的情境 才
02/26 09:33, 34F

02/26 09:33, 7年前 , 35F
請教再下一篇
02/26 09:33, 35F

02/26 09:34, 7年前 , 36F
想知道有什麼情境用他是最好的 @@
02/26 09:34, 36F

02/26 09:43, 7年前 , 37F
另外clang tidy因為有warning,所以再想到底該不該修正
02/26 09:43, 37F

02/26 09:43, 7年前 , 38F
這些東西
02/26 09:43, 38F

02/26 09:44, 7年前 , 39F
clang應該跟你說的llvm rtti有關係吧
02/26 09:44, 39F
文章代碼(AID): #1SShO1yC (C_and_CPP)
文章代碼(AID): #1SShO1yC (C_and_CPP)