异常类的拷贝、移动构造函数和析构函数均应是可访问的
7.15 ID_nonCopiableException
如果异常类的拷贝、移动构造函数或析构函数不可访问,会使异常对象无法适用于完整的异常处理机制,导致意料之外的错误或降低可移植性。
示例:
auto f = async([]() {
throw make_unique<string>("X"); // Non-compliant
});
try {
f.get();
}
catch (unique_ptr<string>& e) {
cout << *e << '\n';
}
例中不可复制的 unique_ptr 对象被抛出,是不符合要求的。
不同编译器对示例代码的处理方式可能存在较大差异,其运行情况可能正常,也可能会崩溃,抑或无法通过编译。
在异步过程中,需要将抛出的异常保存起来,回归同步时再重新抛出异常。某些执行环境需要通过复制来保存异常对象,如果复制接口不完备,可能会造成严重错误。
相关
依据
ISO/IEC 14882:2003 15.1(5)
ISO/IEC 14882:2011 15.1(5)
ISO/IEC 14882:2017 18.1(5)