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;
}

Overloading