먼저 예시를 살펴보자.

int&& a = 5;           // valid
int&& b = x + 2;       // valid
int&& c = someFunc();  // valid if someFunc() returns by value

But:

int x = 10;
int&& r = x;  // ❌ Error! x is an lvalue, not rvalue

위 둘의 차이가 뭘까? 하나는 r-value 즉, 임시 변수로써 값이 존재하며 이를 copy가 아니라 reference할 수 있다.

따라서 &&의 의미는 ‘임시 변수’를 ‘참조’하는 변수라고 볼 수 있겠다.

반대로 이렇게 쓰이는 경우도 있는데

int&& a = 10;
int b = a;

변수 a가 reference로 값을 가지기는 하지만 이름을 가졌으므로 이는 l-value로 취급되어 copy가 이루어지게 된다.

따라서 b의 할당에 한에서는 아래와 같이 동작한다고 할 수 있다.

int a = 10;
int b = a;