正在重试包含同一异常的exception_ptr的多个实例
Rethrowing multiple instances of exception_ptr containing same exception
以下代码段的行为是否定义良好?
std::exception_ptr eptr;
try {
...
} catch (...) {
eptr = std::current_exception();
}
std::exception_ptr eptr2(eptr);
std::vector<std::exception_ptr> eptrs{eptr, eptr2};
for (auto& exc: eptrs) try {
std::rethrow_exception(exc);
} catch(std::exception& e) {
std::cout << e.what() << 'n';
}
如果是,这是否要求异常对象本身(而不仅仅是exception_ptr)是可复制的?
我不能引用标准,但查看文档中的std::exception指针,它指出:
它是一种类似于共享指针的类型:只要至少有一个exception_ptr指向它,被指向的异常就被保证保持有效,这可能会将其生存期延长到catch语句的范围之外或跨线程。
exception_ptr本身可能被复制:
被复制,包括被复制一个空指针值(或nullptr)。
是的,行为已经定义。由于它是一个类似的共享指针类型,因此不需要对包含的异常对象进行复制
这篇文章进一步解释了它:
该功能的原始提案要求在使用std::current_exception捕获异常时复制该异常,但在使用"安腾ABI"(实际上也用于其他平台,如64位x86 linux和MacOSX)的实现者的压力下,该要求被降低,以允许对异常进行引用计数。他们提到的问题是ABI没有存储异常对象的复制构造函数,所以当您调用std::current_exception()时,复制对象所需的信息不存在。
相关文章:
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- CLANG 编译器 说:变量"PTR"可能未初始化
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 正在生成未知类实例
- 如何创建 std::string 包装器,它将 ptr 保留为 std::string 和 ptr 到创建该包装器实例的
- 一个唯一的ptr类如何将它的实例指针传递给它的成员对象