class Bla { ... }
typedef Bla Quiff;
void TuWas()
{
Bla bla;
bla.~Quiff();
}
Ich rufe also den Destruktor einer Instanz auf, allerdings nicht mit dem echten Typnamen, sondern mit einem Alias davon. Der konkrete Typ der Instanz ist an der Stelle von ein paar #ifdefs abhängig, der Alias ist einfach die bequemste Schreibweise. Visual Studio frisst das anstandslos.
Die Frage lautet: wird mit GCC oder CLang das um die Ohren hauen? Oder ist das korrektes C++?
class Bla { ... }
typedef Bla Quiff;
void TuWas()
{
Bla bla;
bla.~Quiff();
}
Ich rufe also den Destruktor einer Instanz auf, allerdings nicht mit dem echten Typnamen, sondern mit einem Alias davon. Der konkrete Typ der Instanz ist an der Stelle von ein paar #ifdefs abhängig, der Alias ist einfach die bequemste Schreibweise. Visual Studio frisst das anstandslos.
Die Frage lautet: wird mit GCC oder CLang das um die Ohren hauen? Oder ist das korrektes C++?
Bye, Thomas
Mal abgesehen davon, dass ich dir deine Frage nicht ohne zu probieren beantworten kann, frage ich mich, WARUM du den Destuktor explizit aufrufen möchtest? Weil Du's kannst?
Also ich weiß das Typedefs bei der Definition/Deklaration des Konstruktors/Destruktors wohl explizit nicht erlaubt sein sollen.
Ich habe gerade mal einen Blick in den Standard geworfen und in diesem Kontext sollte das wohl in Ordnung sein...
12.4.13 hat geschrieben:In an explicit destructor call, the destructor name appears as a ˜ followed by a type-name or decltype-
specifier that denotes the destructor’s class type [...]
Wahrscheinlich ist das ein abgespecktes Beispiel. Mit Placement new erzeugter BUffer, darin Instanz kreiert, die soll abfgeräumt werden -> explizites Rufen vom Destruktor erforderlich :-).
Sollte gehen, das wurde bei mir auch vom gcc gefressen.
Ok, Danke für eure Hilfe. Und ja, das Beispiel war stark eingedampft. Ich versuche aktuell, alle für die RenderPipeline nötigen Daten möglichst nah beieinander liegen zu lassen. Daher habe ich da diverse Speicherblöcke, in denen ich per Placement New Objekte erstelle und dann halt auch irgendwann wieder löschen muss.
kimmi hat geschrieben:Wahrscheinlich ist das ein abgespecktes Beispiel. Mit Placement new erzeugter BUffer, darin Instanz kreiert, die soll abfgeräumt werden -> explizites Rufen vom Destruktor erforderlich :-).
Aaaaaahhh ja, ich benutze das so selten, aber ja .. ich erinnere mich! :D
Ne, für Splatter hat das wenig Bedeutung. Da bin ich auf durchschnittlicher Gamer-Hardware ohne VSync eh schon bei 180fps. Das ist eher langfristig gedacht. Und damit genau genommen für den Moment überflüssig. Aber die ganze Portierung, so wie ich sie aufziehe, ist eh mehr Luxus als Notwendigkeit, daher passt das schon ganz gut.