Оба параметра шаблона int (*)(int)
, поскольку для int(int)
существует спад типа. Таким образом, тип нетипичного параметра шаблона , указанного как int(int)
, распадается на int(*)(int)
.
. Вы можете увидеть, что оба параметра шаблона соответствуют одному и тому же типу, используя неполный type_shower
шаблон класса ниже:
template<typename> struct type_shower;
template <int Function(int)>
struct S1 {
type_shower<decltype(Function)> _;
};
template <int (*Function)(int)>
struct S2 {
type_shower<decltype(Function)> _;
};
Для обоих компилятор выдает одно и то же сообщение об ошибке, в котором указан тип Function
:
error: implicit instantiation of undefined template
'type_shower<int (*)(int)>'
type_shower<decltype(Function)> _;
Обратите внимание, что затухание типа не происходит, если параметр шаблона указан как ссылка на функцию, т. Е. int(&)(int)
:
template <int (&Function)(int)>
struct S3 {
type_shower<decltype(Function)> _;
};
error: implicit instantiation of undefined template
'type_shower<int (&)(int)>'
type_shower<decltype(Function)> _;