Ответ 1
Это происходит из-за правил свертывания ссылок.
В принципе, хотя вы не можете написать ссылку на ссылку самостоятельно, в некоторых случаях (typedefs, параметры шаблона, decltypes) вы можете добавить создать ссылку на ссылочный тип, который сворачивается следующим образом:
A& & -> A&
A& && -> A&
A&& & -> A&
A&& && -> A&&
В вашем случае int_ref
есть int&&
, поэтому int&& &&
становится int&&
.
Соответствующая стандартная цитата:
(N3337) [dcl.ref]/6:
Если typedef (7.1.3), шаблон-параметр типа (14.3.1) или спецификатор decltype (7.1.6.2) обозначает типTR
это ссылка на типT
, попытка создания типа "ссылка lvalue на cvTR
" создает тип "lvalue reference toT
", в то время как попытка создать тип "rvalue reference to cvTR
" создает типTR
.