2015-04-26 32 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()時,複製對象所需的信息不存在。

相關問題