Warum wird der Destruktor der abgeleiteten Klasse bei einer const-Referenz auf die Basisklasse aufgerufen?

8

In GMans Antwort hier , der Destruktor der Klasse restore_base ist nicht virtual , also frage ich mich, wie genau das funktioniert. Normalerweise würde man erwarten, dass der Destruktor von restorer_base nur ausgeführt wird, nachdem das Objekt den Gültigkeitsbereich verlassen hat, aber anscheinend wird der abgeleitete restorer_holder Destruktor wirklich aufgerufen. Will mich jemand aufklären?

    
Xeo 13.02.2011, 17:49
quelle

1 Antwort

18

Der Standardfall, in dem Sie einen virtuellen Destruktor benötigen, ist

%Vor%

Und der Standardfall, in dem nicht ist, ist

%Vor%

GMans Code macht etwas komplizierteres, das entpricht dem zweiten Fall:

%Vor%

obj ist eine bloße Referenz; Normalerweise würde es keine Destruktoren auslösen. Aber es wird von einem anonymen temporären Objekt initialisiert, dessen statischer Typ - dem Compiler bekannt - Derived ist. Wenn die Lebensdauer von das Objekt endet, ruft der Compiler den% destructor Derived auf. Normalerweise stirbt ein anonymes temporäres Objekt am Ende des Ausdrucks , der es erstellt hat, aber es gibt einen speziellen Fall für temporäre Initialisierungen einer Referenz: Sie leben, bis die Referenz selbst stirbt, was hier das Ende des Bereichs ist . Sie erhalten also Pseudo scoped_ptr Verhalten und Sie brauchen keinen virtuellen Destruktor.

BEARBEITEN: Da dies nun zweimal auftaucht: Die Referenz muss nicht sein, damit diese spezielle Regel angewendet wird. C + 98 [class.temporary] / 5:

  

Der zweite Kontext [in dem ein temporäres Objekt am Ende des   Full-Expression] ist, wenn eine Referenz an eine temporäre gebunden ist. Das temporäre, zu dem   Der Verweis ist gebunden oder das temporäre, das das vollständige Objekt zu einem Unterobjekt von ist   an dem das temporäre gebunden ist für die Lebensdauer des Verweises ...

Schwerpunkt meiner. % Co_de% wird in dieser Sprache nicht erwähnt, daher muss die Referenz nicht const sein.

BEARBEITEN 2: Andere Regeln im Standard verbieten die Erstellung nichtkonstanter Referenzen auf temporäre Objekte, die keine lvalues ​​sind. Ich vermute, dass zumindest einige temporäre Objekte Werte sind, aber ich weiß es nicht genau. Unabhängig davon , die diese Regel nicht beeinflusst . Es wäre immer noch formal wahr, dass nicht-konstante Verweise auf temporäre Objekte ihre Lebensdauer verlängern, selbst wenn kein streng übereinstimmendes C ++ - Programm jemals eine solche Referenz erzeugen könnte. Das mag lächerlich klingen, aber du solltest vermeintlich dies wörtlich und pedantisch lesen. Jedes Wort zählt, jedes Wort, das nicht da ist, zählt.

    
zwol 13.02.2011, 18:25
quelle

Tags und Links