W C++ następujący kod daje błąd kompilatora:destruktory z wbudowanych typów (int, char itp ..)
void destruct1 (int * item)
{
item->~int();
}
Ten kod jest prawie taka sama, ja po prostu typedef int do innego typu i coś magicznego dzieje się:
typedef int myint;
void destruct2 (myint * item)
{
item->~myint();
}
Dlaczego działa drugi kod? Czy int dostaje destruktora tylko dlatego, że został typeded?
Jeśli zastanawiasz się, dlaczego ktoś chciałby to zrobić: pochodzi z refaktoryzacji kodu C++. Usuwamy standardowe sterty i zastępujemy je własnymi zbiorami. To wymaga od nas wywoływania nowych miejsc docelowych i destruktorów. Wiem, że wywoływanie destruktorów dla typów pierwotnych jest bezużyteczne, ale chcemy je w kodzie mimo to na wypadek, gdybyśmy później zastąpili POD z prawdziwymi klasami.
Dowiedzenie się, że nagie inty nie działają, ale typowe, to była niespodzianka.
Btw - Mam rozwiązanie, które obejmuje funkcje szablonu. W szablonie wpisaliśmy tylko typef i wszystko jest w porządku.
+1 dla "Świętego Standardu". – ApprenticeHacker
Myślę, że to właśnie sprawia, że std :: is_destructible jest tak niekonsekwentny w starych kompilatorach (2012-2014) – GameDeveloper
Nie mogę odpowiedzieć na tę odpowiedź wystarczająco! – Nils