На самом деле я не думаю, что ваш вопрос показывает пример распада типа. Термин «распад» обычно используется для обозначения стандартных преобразований «от функции к указателю», «от массива до указателя» и «lvalue-to-rvalue». То, что вы делаете, - это правила вывода аргументов шаблона.
Дело в том, что вывод аргумента шаблона основан на типах , не на категориях значений . Тип ref
в вашем примере - MyFunObj
, и это lvalue этого типа (BTW, то же самое верно для fob
). Поскольку дедукция работает над типами, FunObj
выводится на тип of ref
, что действительно MyFunObj
.
До C ++ 11 не было способа для вывода ссылочного типа. C ++ 11 изменил это на «универсальные ссылки». Они ввели специальный случай, когда передача lvalue типа U
в параметр функции, объявленный как T&&
(где T
является параметром шаблона шаблона функции) использует U&
в качестве типа для вычета вместо U
. Но это особое правило, исключение. Обычно категории значений не играют роли в вычитании типа.