Типом выражения y
и выражения z
является int
. Ссылка, появляющаяся в выражении, не будет сохранять тип ссылки. Вместо этого тип выражения будет ссылочным типом, а выражение является lvalue.
Таким образом, в обоих случаях T
выводится на int
, и, таким образом, явная специализация вообще не используется.
Что важно отметить (кроме того, что вы действительно должны использовать перегрузку, как сказал другой парень), это то, что в вашем шаблоне есть параметр не-ссылочной функции. Перед выполнением любого вывода T
на тип аргумента тип аргумента будет преобразован из массивов в указатель на их первый элемент (для функций аргументы будут преобразованы в указатели на функции). Таким образом, шаблон функции с нереференсным параметром функции в любом случае не допускает точного вывода.