Это специализация.Например:
template <typename T>
struct is_void
{
static const bool value = false;
};
Этот шаблон будет иметь is_void<T>::value
как false
для любого типа, что, очевидно, неверно.Что вы можете сделать, это использовать этот синтаксис, чтобы сказать: «Я сам заполняю T и специализируюсь»:
template <> // I'm gonna make a type specifically
struct is_void<void> // and that type is void
{
static const bool value = true; // and now I can change it however I want
};
Теперь is_void<T>::value
равно false
за исключением случаев, когда T
равно void
Затем компилятор выбирает более специализированную версию, и мы получаем true
.
Таким образом, в вашем случае он имеет общую реализацию auto_ptr
.Но эта реализация имеет проблему с void
.В частности, его нельзя разыменовать, поскольку с ним не связано ни одного типа.
Поэтому мы можем специализировать void
вариант auto_ptr
для удаления этих функций.