捕获异常时不应产生对象切片问题
7.20 ID_catch_slicing
通过值捕获多态类的异常对象会使其多态性失效,使异常被错误处理。
本规则是 ID_catch_value 与 ID_objectSlicing 的特化。
示例:
struct Exception {
virtual const char* what() const { return nullptr; }
};
struct Error: public Exception {
const char* what() const override { return "error"; }
};
void foo() {
try {
throw Error();
}
catch (Exception e) { // Non-compliant, use reference instead
log(e.what()); // Only returns nullptr
}
}
例中抛出的是派生类对象,但 what 函数只能返回 nullptr。