Search code examples
c++c++11referencelanguage-lawyerreference-collapsing

Why is adding a reference to a rvalue reference not an error?


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?


Solution

  • 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.