2015-03-05 14 views
16
inline void my_assert(bool cond, const std::exception &e = my_assert_failed()) 
{ 
    if (!cond) 
     throw e; 
} 

Lo standard assicura che:gettare un argomento temporanea passato per riferimento

Un temporaneo legato a un parametro di riferimento in una chiamata di funzione (5.2.2) persiste fino al completamento della piena espressione contenente la chiamata.

E per un oggetto temporaneo gettato:

La temporanea persiste fino a quando v'è un gestore di essere giustiziato per tale eccezione.

Posso dedurre che un temporaneo passato a my_assert sopravvive fino al termine del blocco di cattura?

+3

Il throw' [espressione] '(http://en.cppreference.com/w/cpp/language/throw) esegui una copia della sua argomentazione in modo da non gettare il temporaneo. – user657267

+4

@ user657267 Questa è una risposta. – Angew

risposta

9

Da N4296 (prima stesura dopo finale C++ 14) [15.1p3]:

un'eccezione copia-inizializza (8.5, 12.8) un oggetto temporaneo, chiamato l'oggetto eccezione. Il temporaneo è un lvalue e viene utilizzato per inizializzare la variabile dichiarata nel gestore di corrispondenza (15.3).

Quindi non si può presumere che il tuo temporaneo "sopravvive al lancio". Se si lancia, il costruttore di copie di un oggetto di eccezione di tipo std::exception verrà chiamato con l'argomento e. Il temporaneo a cui è associato e verrà distrutto quando il controllo lascia l'espressione completa che contiene la chiamata a my_assert (dopo un normale ritorno o come parte dello srotolamento dello stack, poiché l'eccezione viene lanciata condizionalmente).

Ci sono circostanze in cui la costruzione copia dell'oggetto eccezione può essere eliso, ma questo non è uno di loro, secondo [12.8p31.2]:

- in una rimessa espressione (5.17), quando l'operando è il nome di un oggetto automatico non volatile (diverso da una funzione o catch-clausola parametro) il cui ambito non si estende oltre la fine del blocco try del blocco interno (se presente uno), l'operazione di copia/spostamento da l'operando all'oggetto eccezione (15.1) può essere omessa da creazione dell'oggetto automatico direttamente nell'oggetto eccezione

(enfasi mia)

+1

Ottima risposta, precisa e sonora. Modificata la domanda per affinare "sopravvive alla proiezione". –

Problemi correlati