2016-06-15 43 views
14

Il libro C++ Concurrency in Action da Anthony Williams afferma in 4.2.4 Risparmio un'eccezione per il futuro che è possibile memorizzare un'eccezione direttamente senza lanciare tramite std::copy_exception. Tuttavia, non riesco a trovare l'intestazione della libreria standard in cui è definito std::copy_exception. Dove posso trovarlo?Dove è definito std :: copy_exception?

risposta

20

tl; dr: std::copy_exception è stato rinominato in std::make_exception_ptr<exception> per la finale di serie C++ 11.


la commissione ha deciso che il nome copy_exception (probabilmente copiato nello standard da boost::copy_exception) era fuorviante per i seguenti motivi.

La funzione copy_exception restituisce un exception_ptr a una copia della sua tesi, come se

template <class E> 
exception_ptr copy_exception(E e) { 
    try { 
     throw e; 
    } catch (...) { 
     return current_exception(); 
    } 
} 

Quando viene chiamato con un exception_ptr come argomento, la funzione sarebbero tornati un'altra exception_ptr che punta a una copia del exception_ptr data come argomento , invece di puntare a ciò a cui punta l'argomento exception_ptr. Poiché il nome copy_exception era fuorviante per questo caso, la funzione è stata rinominata in std::make_exception_ptr per lo standard finale C++ 11. Vedere lo C++ Standard Library Defect Report 1130 per dettagli e discussioni su questo problema.

La funzione std::make_exception_ptr è definita in <exception>.

Problemi correlati