Seite 1 von 1

Referenz - Destruktor - Verwirrung

Verfasst: 10.03.2012, 16:54
von B.G.Michi
Guten Tag zusammen

Ich bin vor ein paar Tagen auf auf einen Codeschnipsel gestoßen der mich etwas irritiert hat. kann mich nicht mehr erinnern wo aber so in etwa:

Code: Alles auswählen

#include <stdio.h>

class A
{
public:
	A() { printf("A()\n"); }
	~A() { printf("~A()\n"); }
};

int main(int argc, char *argv[])
{
	{
		const A& a = A();	// <- Knackpunkt
		printf("test\n");
	}

	getchar();
	return 0:
}
Kompiliert mit VC11 Beta oder GCC wird dabei der Destruktor von a nach printf("test\n") aufgerufen. Warum überhaupt, was sagt der Standard dazu?
Noch wilder wird die Sache, wenn man den Konstruktor von A auskommentiert. Dann wird mit VC der Destruktor zweimal aufgerufen, und zwar einmal vor und einmal nach printf("test\n").

Is zwar warscheinlich ned so arg wichtig, würd mich aber doch interessieren was da abläuft (oder eher "warum").

Re: Referenz - Destruktor - Verwirrung

Verfasst: 11.03.2012, 00:34
von dot
Wenn ein Temporary an eine lokale Referenz gebunden wird, dann wird der Temporary erst am Ende des Scope der Referenz zerstört und nicht bereits am Ende der Auswertung der Full-Expression in der er vorkommt (Lifetime Extension nach §12.2 Absatz 5).
Bin mir grad nicht sicher wieso der MSVC mit dem Default Ctor offenbar zwei Temporaries erzeugt und ob das erlaubt ist.

Re: Referenz - Destruktor - Verwirrung

Verfasst: 11.03.2012, 02:21
von B.G.Michi
Ah, vielen Dank. Genau das, was mich interessiert hat.
(wenn einem Google doch auch sagen könnte wonach man googeln will :) )