2015-04-26 33 views
1

以下代码段的行为是否定义良好?重新计算包含相同异常的exception_ptr的多个实例

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)是可复制的?

+0

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

回答

2

我无法引用标准,但看documentation性病::异常指针它指出:

它是一个共享指针样型:尖异常保证有效期为为只要至少有一个exception_ptr指向,潜在地将其生存期延长超出catch语句的范围或跨线程。

的exception_ptr本身可以被复制:

被复制,包括被复制的空指针值(或nullptr)。

所以是的,行为是定义的。 既然是共享指针状类型,存在一种用于所容纳的异常对象没有复制要求

article解释这一点进一步:要求该

该功能的原来的建议异常在被std :: current_exception捕获时被复制,但在使用“Itanium ABI”(实际上也用于其他平台,如64位x86 linux和MacOSX)的实现者的压力下,需求减少以允许引用计数异常。他们引用的问题是,ABI没有存储异常对象的拷贝构造函数,所以当您调用std :: current_exception()时,复制对象所需的信息不存在。

相关问题