异常类的拷贝构造函数不可抛出异常
7.12 ID_throwWhileThrowing
异常类的拷贝构造函数抛出异常违反异常处理机制,会导致程序异常终止。
当抛出异常时,throw 表达式指定的异常对象会被复制,用以初始化相应 catch 子句的参数,如果在复制过程中又抛出异常便违反了异常处理机制,这种情况将直接引发 std::terminate 函数的执行,使程序异常终止。
示例:
class E {
public:
E() {}
E(const E&) {
throw 0; // Non-compliant
}
};
int main() {
try {
E e0;
throw e0; // Throw while throwing, calls std::terminate()
}
catch (E& e1) {
....
}
}
例中 catch 子句的参数 e1 引用由 e0 复制而成的临时对象,在复制过程中抛出的异常无法被捕获,会直接导致程序异常终止。
相关
依据
ISO/IEC 14882:2003 15.1(3)
ISO/IEC 14882:2011 15.1(3 7)
ISO/IEC 14882:2017 18.1(3 7)