判断 dynamic_cast 转换是否成功
12.17 ID_nullDerefDynamicCast
dynamic_cast 转换指针失败会返回空指针,转换引用失败会抛出异常,如果不作判断则失去了使用 dynamic_cast 的意义。
示例:
void foo(A* a) {
dynamic_cast<B*>(a)->foo(); // Non-compliant
}
应改为:
void foo(A* a) {
if (auto* b = dynamic_cast<B*>(a)) { // Compliant
b->foo();
}
}
使用 dynamic_cast 会产生一定的开销,如果不对其结果作判断,还不如使用 static_cast 等转换,但本规则集合不建议采用非 dynamic_cast 的动态类型转换,参见 ID_nonDynamicDownCast。
相关
依据
ISO/IEC 14882:2003 5.2.7(9)
ISO/IEC 14882:2011 5.2.7(9)