cattura oggetti eccezione per riferimento, provvisori, problemi di durata
-
13-09-2019 - |
Domanda
Si consideri il seguente codice:
#include <iostream>
#include <stdexcept>
void foo()
{
throw std::runtime_error("How long do I live?");
}
int main()
{
try
{
foo();
}
catch (std::runtime_error& e)
{
std::cout << e.what() << std::endl;
}
}
Perché è possibile intercettare l'eccezione per riferimento, non è un std::runtime_error("How long do I live?")
rvalue?
Come mai l'oggetto eccezione è ancora vivo nel blocco catch?
Dove esattamente sono memorizzati gli oggetti eccezione generata? Qual è la loro vita?
Nessuna soluzione corretta
Altri suggerimenti
Nella serie C ++, paragrafo 15.1.4:
La memoria per la copia temporanea l'eccezione è essere buttato allocata in modo non specificato, salvo quanto indicato in 3.7.3.1. Il temporanea persiste fintanto che non v'è un gestore in corso di esecuzione per questo eccezioni . In particolare, se un handler esce eseguendo un tiro; dichiarazione, che passa il controllo a un altro gestore per lo stesso eccezione, così i resti temporanei. Quando viene eseguito l'ultimo gestore per le uscite di eccezione con qualsiasi mezzo diverso da buttare; l'oggetto temporaneo è distrutta e l'attuazione può rilasciare la memoria per la oggetto temporaneo; tale deallocazione è fatto in un non meglio specificato modo. La distruzione avviene subito dopo la distruzione di l'oggetto dichiarato nel eccezioni dichiarazione nel gestore.
Si noti che, in C ++ -. Standard parlare, un gestore denotano un blocco catch
con il tipo di argomento corretto
Un'eccezione generata non è una temporanea - il codice di eccezione generato dal compilatore mantiene una copia permanente di esso. Quindi è possibile associare ad un punto di riferimento non-const.
[modifica] Ho solo controllare il livello e si riferisce in realtà ad una copia temporanea. Tuttavia, la durata della temporanea è garantita per almeno finché quella del gestore di eccezioni.
Come ha detto Neil, non c'è magia compilatore interno in corso. Inoltre, essere consapevoli del fatto che il compilatore è permesso di creare qualsiasi numero di copie dell'oggetto eccezione.
Complimenti per cercare di capire i dettagli del linguaggio. Allo stesso tempo, secondo me, è molto più importante capire il motivo per cui dovrebbe catturare un'eccezione per riferimento (e gettarlo per valore), di cui si possono .
La gente in genere utilizzano una gerarchia di classi di eccezioni, e la cattura con riferimento consente di sfruttare il polimorfismo, e rilevare un'eccezione della classe base, quando non v'è alcuna necessità di gestire i singoli tipi di eccezione separatamente. Se non si poteva prendere per riferimento, si sarebbe dovuto scrivere una clausola di catch
per ogni possibile tipo di eccezione che può essere gettato nella clausola try
.