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 호출
그리고 마지막 결과는 (이름있는) 우측값 참조 자체는 우측값이 아닌 좌측값이라는 사실로부터 기인한다.
'NC University > Advanced C++' 카테고리의 다른 글
5일차 - move semantics (0) | 2015.09.14 |
---|---|
5일차 - 완벽한 전달자 (perfect forwarding) (2) (2) | 2015.09.06 |
5일차 - 가변인자 템플릿 (variadic template) (2) (0) | 2015.08.21 |
5일차 - 가변인자 템플릿 (variadic template) (1) (0) | 2015.08.12 |
5일차 - range-based for loop (0) | 2015.08.11 |