Mi chiedo, per nessun altro scopo che pura curiosità (perché nessuno DOVREBBE mai scrivere un codice come questo!) Su come il comportamento di RAII si configura con l'uso di goto (bella idea non è) .Cosa succede quando uniamo RAII e GOTO?
class Two
{
public:
~Two()
{
printf("2,");
}
};
class Ghost
{
public:
~Ghost()
{
printf(" BOO! ");
}
};
void foo()
{
{
Two t;
printf("1,");
goto JUMP;
}
Ghost g;
JUMP:
printf("3");
}
int main()
{
foo();
}
Quando si esegue il seguente codice in Visual Studio 2005 ottengo il seguente output.
1,2,3 BOO!
Tuttavia ho immaginato, indovinato, sperato che 'BOO!' non appare in realtà come Ghost non dovrebbe mai essere istanziato (IMHO, perché non conosco l'effettivo comportamento previsto di questo codice).
Che succede?
Ho appena realizzato che se un'istanza di un costruttore esplicito per Ghost il codice non viene compilato ...
class Ghost
{
public:
Ghost()
{
printf(" HAHAHA! ");
}
~Ghost()
{
printf(" BOO! ");
}
};
Ah, il mistero ...
Credo che il comportamento sia corretto. Altrimenti, come potresti riferire la variabile g dopo JUMP? – leiz
http://xkcd.com/292/ –