In C++ den folgenden Code gibt einen Compiler-Fehler:Destructors von eingebauten Typen (int, char etc ..)
void destruct1 (int * item)
{
item->~int();
}
Dieser Code ist fast das gleiche, ich habe gerade typedef int auf eine andere Art und etwas Magie passiert:
typedef int myint;
void destruct2 (myint * item)
{
item->~myint();
}
Warum funktioniert der zweite Code? Erhält ein int einen Destruktor, nur weil er typedefed ist?
Falls Sie sich fragen, warum Sie das jemals tun möchten: Das kommt vom Refactoring von C++ - Code. Wir entfernen den Standard-Heap und ersetzen ihn durch selbst erstellte Pools. Dazu müssen wir Placement-Neu und die Destruktoren aufrufen. Ich weiß, dass das Aufrufen von Destruktoren für primitive Typen nutzlos ist, aber wir wollen sie trotzdem im Code haben, falls wir später PODs durch echte Klassen ersetzen.
Herauszufinden, dass naked int's nicht funktionieren, aber typedefed tun, war eine ziemliche Überraschung.
Btw - Ich habe eine Lösung, die Template-Funktionen beinhaltet. Wir tippen einfach in die Vorlage und alles ist in Ordnung.
+1 für "The Holy Standard". – ApprenticeHacker
Ich denke, das ist, was std :: is_destructible in alten Compilern so inkonsistent macht (2012-2014) – GameDeveloper
Kann diese Antwort nicht genug stimmen! – Nils