C++ 重新引用包含同一异常的多个异常\u ptr实例

C++ 重新引用包含同一异常的多个异常\u ptr实例,c++,exception,c++11,C++,Exception,C++11,以下代码段的行为是否定义良好 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_exc

以下代码段的行为是否定义良好

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';
}
std::exception\u ptr eptr;
试一试{
...
}捕获(…){
eptr=std::当前_异常();
}
std::异常(eptr)eptr2(eptr);
std::向量eptrs{eptr,eptr2};
对于(自动和exc:EPTR)请尝试{
std::返回异常(exc);
}捕获(标准::异常&e){

std::cout我无法引用该标准,但查看for std::exception指针,它指出:

它是一种类似指针的共享类型:只要至少有一个异常\u ptr指向它,指向的异常就保证保持有效,这可能会将其生存期延长到catch语句范围之外或跨线程

可以复制异常ptr本身:

正在复制,包括正在复制空指针值(或nullptr)

是的,行为是有定义的。 由于它是一种类似于指针的共享类型,因此对包含的异常对象没有复制要求

这进一步解释了这一点:

该功能的最初提议要求在使用std::current_异常捕获异常时复制异常,但受到使用“安腾ABI”的实现者的压力(实际上也用于其他平台,如64位x86 linux和MacOSX),减少了要求,允许引用计数异常。他们提到的问题是,ABI没有存储异常对象的复制构造函数,因此当调用std::current_exception()时,复制对象所需的信息不存在


但是,当我们重新引用exception_ptr的两个实例中的一个并抛出基础异常时,它是原始异常的副本吗?因为仍然有exception_ptr的第二个实例包含原始异常。