class X{};
void Foo(X& x) {}
void Foo(const X& x) {}
void Foo(X&& x) {}
void main()
{
X x;
Foo(x); // lvalue
// 1번 호출, 없으면 2번
Foo(X()); // rvalue
// 3번 호출, 없으면 2번
X&& rx = X(); // 이름을 가지는 순간 lvalue
Foo(rx); // 1번 호출
// && 로 캐스팅할 경우에는 타입을 캐스팅 하는거라고 C++ 표준에서 정의
// 즉 lvalue->rvalue 캐스팅 방식이라고 볼 수 있다.
Foo(static_cast<X&&>(rx)); // 3번 호출.
// && 는 rvalue로만 초기화할 수 있다.
int&& i = 3;
}