본문 바로가기
NC University/Advanced C++

5일차 - 우측값 (R-value)

by 날쑤 2015. 8. 24.

Intro

  우선 우측값(rvalue)와 좌측값(lvalue)의 정의부터 확인해보자.

  • 좌측값: =의 왼쪽과 오른쪽에 모두 올수 있는것, 대부분 이름이 있음. 
     ex) 변수, 참조를 리턴하는 함수
  • 우측값: =의 오른쪽에만 올수 있는것, 대부분 이름이 없음.
     ex) 상수, 값을 리턴하는 함수

  간단한 예제를 살펴보자.

  이제는 두 값타입에 대한 참조(reference)를 고려해보자. 기존의 C++의 참조는 아래와 같이 좌측값에 대한 참조만이 가능했다.(lvalue reference)

  하지만 C++ 11로 넘어오면서 우측값을 참조하는 문법(rvalue reference)이 추가되었다.

우측값 참조와 함수 오버로딩

  우측값 참조는 함수 오버로딩에서도 사용될 수 있다. 같은 이름을 갖지만 각각 좌측값 참조와 우측값 참조 하나를 파라메터로 가지는 함수 두개를 고려해보자.

  그리고 두 함수를 각각 호출해보자.

  예상과 크게 다르지 않다. 첫번째 호출은 변수(lvalue)를 인자로 받았기 때문에 함수 (1)을 호출하고, 두번째 호출은 상수(rvalue)를 받아서 함수 (2)를 호출한다. 이번에는 각 값타입에 대한 참조를 통해 함수를 호출해보자.

  첫번째 호출은 좌측값 참조를 받아서 함수 (1)을 호출한다. 문제는 두번째 호출이다. 두번째 호출에서 사용된 인자는 우측값 참조이다. 여기서 중요한 것은 우측값 참조는 우측값을 참조할 수 있지만, 우측값 참조 자체는 좌측값이라는 사실이다. 그러므로 두번째 호출에서 사용되는 함수는 (2)가 아니라 (1)이 된다.

  정리하자면 다음과 같이 요약가능하다.

  • f(좌측값) -> 좌측값 참조를 파라메터로 가지는 함수 f 호출
  • f(우측값) -> 우측값 참조를 파라메터로 가지는 함수 f 호출
  • f(우측값 참조) -> 좌측값 참조를 파라메터로 가지는 함수 f 호출

  그리고 마지막 결과는 (이름있는) 우측값 참조 자체는 우측값이 아닌 좌측값이라는 사실로부터 기인한다.