[问题] 什么时候用 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