Molte persone sono senza dubbio familiarità con il modello Mr. Alexandrescus ScopeGuard (ora parte di Loki) e la nuova versione ScopeGuard11 qui presentata: http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-CPerché Alexandrescu non può utilizzare std :: uncaught_exception() per implementare SCOPE_FAIL in ScopeGuard11?
con fonte qui: https://gist.github.com/KindDragon/4650442
Nel suo discorso in C++ e oltre il 2012 ha menzionato che non è stato in grado di trovare un modo per rilevare correttamente se l'oscillazione è stata interrotta a causa di un'eccezione. Pertanto non è stato in grado di implementare una macro SCOPE_FAIL che eseguisse il lambda fornito (di solito utilizzato per il codice di rollback) se e solo se l'ambito è stato chiuso a causa di un'eccezione. Ciò renderebbe non necessaria la funzione membro dismiss() e renderebbe il codice più leggibile.
Dato che io sono in alcun modo come genio o vissuta come Mr. Alexandrescu mi aspetto che implementando SCOPE_FAIL non è così facile come questo:
~ScopeGuard11(){ //destructor
if(std::uncaught_exception()){ //if we are exiting because of an exception
f_(); //execute the functor
}
//otherwise do nothing
}
mia domanda è perché no?
È strano, qualcosa mi dice che dovrebbe funzionare, ma se provo, 'uncaught_exception()' restituisce sempre 'false'. –
Ricordo vagamente Herb Sutter che ha qualcosa del genere su GotW quando torna, ma non riesco a trovarlo più. Forse Alzheimer;) o non sto googleing la cosa giusta. – odinthenerd
Penso che nel caso di protezione dell'ambito, si possa effettivamente usare 'std :: uncaught_exception', poiché la guardia dell'ambito non sarà mai un membro di un'altra classe (e sicuramente non una variabile locale in un distruttore di classe). – Xeo