This is due to reference collapsing rules.
Basically, although you can't write a reference to a reference yourself, in some cases (typedefs, template parameters, decltypes) you can add create a reference to a reference type, which collapses as follows:
A& & -> A&
A& && -> A&
A&& & -> A&
A&& && -> A&&
In your case, int_ref
is int&&
, so int&& &&
becomes int&&
.
The relevant standard quote:
(N3337) [dcl.ref]/6:
If a typedef (7.1.3), a type template-parameter (14.3.1), or a decltype-specifier (7.1.6.2) denotes a type TR
that is a reference to a type T
, an attempt to create the type “lvalue reference to cv TR
”creates the type
“lvalue reference to T
” , while an attempt to create the type “rvalue reference to cv TR
”creates the type TR
.