Одна из особенностей пересылки ссылок заключается в том, что у вас никогда не бывает «просто значения».
Когда T
выводится как S
, это только потому, что функция фактически принимает S&&
.
Когда вы передаете свои локальные переменные, дедукция типов распознает, что это l-значения, и связывает их с обычными ссылками. A const
один в случае const S s
. Сигнатура функции «изменяется», чтобы отразить это.
У вас будет (const S&)&&
, который, согласно стандарту, сворачивается до const S&
, а затем у вас будет (S&)&&
, который сворачивается до S&
, согласно правилам свертывания ссылок.
См. [dcl.ref]