Lebensdauer des Ausnahmeobjekts

8

Ich möchte wissen, wie das Ausnahmeobjekt erstellt wird? und warum der Handler-Funktionsparameter eine nicht-konstante Referenz sein kann?

Zum Beispiel:

%Vor%

Ausgabe: Konstruktor von E (): Nicht mehr im Speicher

Ich habe also throw E("out of memory") und E("out of memory") ist nur ein temporäres Objekt und es wurde kein Objekt außer E("out of memory") erstellt, da 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 verwendet.

Können Sie mir erklären, warum das möglich ist?

    
AlexDan 21.10.2012, 15:53
quelle

1 Antwort

10
  

möchte wissen, wie das Ausnahmeobjekt erstellt wird?

Wenn Sie dies tun:

%Vor%

Sie erstellen ein Objekt (vom Typ E) lokal. Die Prozesse des Werfens kopieren dieses Objekt an einen privaten Speicherort, der nicht durch den Standard definiert ist. Daher muss das geworfene Objekt kopierbar sein.

Hinweis: Der Compiler darf die Kopie optimieren und direkt am privaten Ort erstellen. Die Tatsache, dass es nicht kopiert wird, liegt daran, dass der Compiler die Kopie optimiert hat (also nicht mehr lokal ist). Versuchen Sie, den Kopierkonstruktor privat zu machen, und jetzt wird es nicht mehr kompiliert.

  

und warum der Handler-Funktionsparameter eine nicht-konstante Referenz sein kann?

Wenn Sie das Objekt fangen:

%Vor%

Sie erhalten einen Verweis auf das Objekt an dem privaten Ort, an den es kopiert wurde. Es ist kein const (oder temporärer) Wert, so dass Sie einen normalen Verweis darauf haben können.

    
Martin York 21.10.2012, 16:18
quelle

Tags und Links