面向派生类的 catch 子句应排在面向基类的 catch 子句之前
9.6.5 ID_try_disorderedHandlers
以派生类对象为参数的 catch 子句应排在以基类对象为参数的 catch 子句之前,否则后面的 catch 子句会失去作用。
示例:
class B {};
class D: public B {};
try {
....
} catch (B&) {
....
} catch (D&) { // Non-compliant, unreachable
....
}
例中 B 为基类,D 为派生类,D 类异常会被第一个 catch 子句捕获,第二个 catch 子句失去了作用。
应改为:
try {
....
} catch (D&) {
....
} catch (B&) { // Compliant
....
}
相关
依据
ISO/IEC 14882:2003 15.3
ISO/IEC 14882:2011 15.3
ISO/IEC 14882:2011 18.3