Код STL, который я читаю, может быть старым... но вопрос больше связан с грамматикой шаблонов С++.
Вопрос окружает эту шаблонную функцию stl:
template<class T> std::destroy(T *p) {
p->~T();
}
Я не могу найти специализацию функции std:: destroy (T *). Поэтому мне кажется, что функция шаблона будет создавать экземпляры для типов "int" и вызывать "int" destructor. Чтобы выразить свою точку зрения, я создал этот образец кода, который эмулирует std:: destroy. Я называю это my_destroy в этом примере.
#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.
}
}
К моему удивлению, эта строка не компилируется:
a->~int();
Но эта строка компилируется:
my_destroy<int>(a);
Моя путаница в том, что я думал, что my_destroy<int>(a)
будет создан как эквивалент a->~int();
В более крупном контексте, когда контейнер STL <int>
стирает элемент, как работает std::destroy()
?