Это
template <class locale>
static void Delete(void* ptr) {
delete (locale*)ptr;
}
не является специализацией.Это перегрузка.Специализация была бы такой:
template <>
static void Delete(locale* ptr) {
delete (locale*)ptr;
}
Так что на самом деле это эквивалентно записи просто
template <class T>
static void Delete(void* ptr) {
delete (T*)ptr;
}
На самом деле, вы представили поведение из-за разрешения перегрузки в строке
T_delete_function = &Deleter::Delete<T>;
Вторая перегрузка более специфична, так как принимает void*
, а не T*
, а тип в любом случае указывается явно.Таким образом, при наличии упомянутой перегрузки он выбирает его, компилирует и работает нормально.В отсутствие этой более конкретной перегрузки компилятор вызывает другую подходящую, но более общую, которая запускает утверждение.
Вы можете проверить это дважды, то есть удалить строку #include <locale>
: компилятор не будет жаловаться на class locale
будучи необъявленным.