Из-за идеальной пересылки, когда аргумент P&&
является lvalue, тогда P
будет выведен на тип аргумента плюс присоединенный &
.Таким образом, вы получаете int & &&
с P
, равным int&
.Если аргумент является r-значением, то P
будет выводиться только для типа аргумента, поэтому вы получите получите аргумент int&&
с P
, равным int
, если вы передадите, например 0
напрямую.
int& &&
свернется до int&
(это семантическое представление - синтаксически int& &&
недопустимо. Но высказывание U &&
, когда U
является параметром шаблона или typedef, ссылающимся на тип int&
, тогда U&&
по-прежнему является типом int&
- т.е. две ссылки «сворачиваются» в одну ссылку lvalue).Вот почему t
имеет тип int&
.