Ich möchte wissen, wie das Ausnahmeobjekt erstellt wird? und warum der Handler-Funktionsparameter eine nicht-konstante Referenz sein kann?Lebensdauer des Ausnahmeobjekts
Zum Beispiel:
class E{
public:
const char * error;
E(const char* arg):error(arg){
cout << "Constructor of E(): ";}
E(const E& m){
cout << "Copy constructor E(E& m): " ;
error=m.error;
}
};
int main(){
try{
throw E("Out of memory");
}
catch(E& e){cout << e.error;}
}
Ausgang: Constructor von E(): Nicht genügend Arbeitsspeicher
so habe ich throw E("out of memory")
und E("out of memory")
ist nur ein temporäres Objekt und kein Objekt wurde erstellt, außer E("out of memory")
, da kein Kopierkonstruktor aufgerufen wurde. Obwohl diese nur ein temporäres Objekt ist, habe ich einen Handler, der eine nicht-konstante Referenz verwendet.
Können Sie mir erklären, warum das möglich ist?
'weil kein Kopierkonstruktor aufgerufen wurde. Obwohl dieses E ("out of memory") nur ein temporäres Objekt ist, habe ich einen Handler, der eine nicht-konstante Referenz nimmt - http://en.wikipedia.org/wiki/Copy_elision –
@skwllsp: so Dies liegt an der Optimierung. Bedeutet dies, dass das temporäre Objekt nicht erstellt wurde und das Argument direkt an das Ausnahmeobjekt übergeben wurde? – AlexDan