I have the following typedef:
using int_ref = int&&;
Why does the following code not produce an error (or print false
)?
std::cout << is_same< int_ref, int_ref&& >::value; // prints 1
I would expect that int_ref&&
gets expanded to int&& &&
which is obviously not possible. Am I missing something?
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 typeTR
that is a reference to a typeT
, an attempt to create the type “lvalue reference to cvTR
”creates the type “lvalue reference toT
” , while an attempt to create the type “rvalue reference to cvTR
”creates the typeTR
.