Kod STL, który czytam może być stary ... ale pytanie jest bardziej związane z gramatyką szablonu C++.C++ std :: destroy (T * wskaźnik)
Pytanie otacza tę stl szablonu funkcję:
template<class T> std::destroy(T *p) {
p->~T();
}
I nie wydają się znaleźć specjalizacji funkcji std :: zniszczyć (T *). Wydaje mi się więc, że funkcja szablonu będzie tworzyła to samo dla typów "int" i wywoływała destruktor "int". Aby o tym mówić, stworzyłem ten przykładowy kod emulujący std :: destroy. Nazywam to my_destroy ih the example.
#include <iostream>
#include <stdio.h>
using namespace std;
template <class T>
void my_destroy(T * pointer) {
pointer->~T();
}
int main()
{
int *a;
//a->~int(); // !!! This won't compile.
my_destroy<int>(a); // !!! This compiles and runs.
}
}
Ku mojemu zaskoczeniu, linia ta nie kompiluje:
a->~int();
Ale ta linia kompiluje:
my_destroy<int>(a);
Moja dezorientacja jest, myślałem, że my_destroy<int>(a)
zostanie utworzony jako odpowiednik a->~int();
Na pytanie w większym kontekście, gdy pojemnik STL z <int>
wymazuje element, jak działa std::destroy()
?
Nie wiem, dlaczego jest to odrzucane, jest to uzasadnione pytanie. +1 – Rapptz
To się nazywa pseudo-destruktor i ma własne, specjalne zasady. Zasadniczo można użyć tylko * nazwy typu *, która jest nazwą klasy/enum lub nazwą typef. – dyp
To, że nie można użyć słowa kluczowego do oznaczenia połączenia z destruktorem. 'typedef int INT; a-> ~ INT(); 'kompiluje. – milleniumbug