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
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>
.