Попробуйте скомпилировать ниже код
template<void>
void foo(){}
Я получил ошибку компилятора 'void' недопустимый тип для параметра не тип шаблона .
В качестве параметра шаблона вы можете передать:
1) type , затем вы объявляете его, используя class / typename, как показано ниже:
template< class/typename A[optional] = void>
void foo2(){}
2) non-type тогда вы можете передать в качестве параметра шаблона некоторое значение типа integer, указатели, ссылку на Lvalue и т. д. (полный список здесь )
template<void*>
void foo3(){}
3) параметр типа шаблона
В вашем примере is_nothrow_move_constructible
возвращает true для A
, тогда компилятор встречает строку:
template <typename U = T, enable_if_t<is_nothrow_move_constructible<U>{}>>
что такое:
template <typename U = T, void>
эта строка имеет неверный синтаксис, и компиляторудаляет этот шаблон функции-члена из набора перегрузок.Вы можете исправить это, объявив enable_if_t<is_nothrow_move_constructible<U>{}
в качестве параметра типа:
template <typename U = T,
typename = enable_if_t<is_nothrow_move_constructible<U>{}> > // typename = void
void realloc_impl(priority_tag<2> pr)
{
cout << "nothrow move \n";
};
или в качестве нетипового (указатель на void), что вы сделали в своем примере.