우측값 참조는 C++11에서 생긴 개념이다. 좌측값 참조는 우리가 흔히 알고 있는 참조를 말한다. 흔히 수식에서 Rvalue, Lvalue로 데이터의 상태를 나타내는데 일반적인 변수는 Lvalue, 상수나 임시객체(값)은 Rvalue가 된다.
예를 들어 int a = 3; int b = 4; int c = a+b; int d = 3;// 여기에서 a, b c, d는 Lvalue가 되고, a+b, 3은 Rvalue가 된다.
Lvalue는 수식의 계산이 끝난 후에도 지속적으로 존재하는 변수들이고, 3이란 값이나 a+b는 Rvalue로 임시 객체내에서 존재하다가 식의 계산이 끝난 후 임시객체는 파괴된다.
우측값 참조
우리가 흔이 알고 있는 참조는 좌측값 참조다. 이런 일반적인 참조의 경우는 우측값을 참조할 수 없다. 따라서 다음과 같은 표현은 쓸 수가 없다.
'비 const참조에 대한 초기 값은 lvalue여야 합니다.'라고 친절하게 알려준다. 여기서 3과 a+b는 Rvalue이므로 에러가 난 것이다. 그리고 e의 경우처럼 const 참조인 경우는 우측값도 참조할 수 있다는 것!(물론 좌측값도 참조할 수 있다.)
다음은 우측값 참조를 사용한 경우다.
(참고 : const 참조로 우측값을 참조할 수 있지만, 우측값 참조와 다른 점이 있다. 첫째로, 상수화가 되어 더 이상 값의 조작을 할 수 없다는 점. 두 번째는 이제 살펴볼 내용이다.)
우측값 참조를 사용하는 이유
우측값 참조를 사용하여 오버헤드를 줄일 수 있다. 임시객체(우측값)가 대입이 되는 과정은 복사를 통해서 이루어진다. 따라서 다음과 같이 복사가 이루어지고, 임시객체는 파괴가 된다.
자료형이 int형인 경우는 별 문제 없겠지만, 크기가 큰 자료형인 경우에 이런 복사를 반복적으로 해야 한다면 사정은 달라진다. 이 때 우측값 참조를 사용하면 오버헤드를 줄일 수 있다.
우측값 참조는 위 과정에서 복사를 하지 않고 임시객체를 그대로 이용하는 것이다. 우측값을 마치 좌측값 참조처럼 이용하는 것이다. 복사도 파괴도 이루어지지 않는다.
잘 기억은 나지 않는데 몇몇 STL 컨테이너들도 우측값 참조를 이용하여 퍼포먼스를 높였다고 들었다.(이 부분은 나중에 찾아봐야겠다.)
이 예는 클래스에 우측값 참조를 위한 생성자가 마련된 경우로 생성자에 인수가 우측값이 전달된 경우에도 잘 동작한다.