2015년 6월 8일 월요일

[C++11] R-Value 레퍼런스


[C++11] R-Value 레퍼런스 C++11 / Programming
2014.04.29. 17:16 수정 삭제
전용뷰어 보기
C++11에서는 R-Value 라는 용어가 새로 등장했습니다. 이와 함께 L-Value 라는 용어도 등장했는데 L-Value는 사실 기존 C++ 부터 사용하던 레퍼런스의 다른 말입니다. R-Value 레퍼런스와 기존 레퍼런스를 구분하기 위해 L-Value 라는 용어를 사용한 것이죠.
그렇다면 L-Value와 R-Value가 뭘까요? 그냥 보면 왼쪽에 있는 값과 오른쪽에 있는 값 같습니다. 저도 처음에는 그렇게 생각했습니다.

정확하게 정의하자면 L-Value는 왼쪽 오른쪽 어디에도 올수 있는 값이고 R-Value는 오른쪽에만 올수 있는 값입니다. 그리고 L-Value는 참조가 가능하고 R-Value는 참조가 불가능합니다.
int a = 1; // a는 L-Value이고 1은 R-Value 입니다.
int b = a; // b는 L-Value입니다.
// 1 = a; // 에러가 발생합니다. 1은 R-Value이므로 왼쪽에 올수 없습니다.

대충 이해가 가시나요? 값을 참조하는 경우를 살펴봅시다.
int a = 1;
int *b = &a; // a는 L-Value이므로 참조가 가능합니다.
// int c = &1; // 1은 R-Value이므로 참조가 불가능합니다.


그런데 C++11에서 R-Value를 참조 가능하게 만들었습니다. 이동 시맨틱과 퍼펙트 포워딩을 위해 적용한 개념이라고 합니다. 이동 시맨틱과 퍼펙트 포워딩은 추후 정리하겠습니다.
그럼 R-Value를 어떻게 참조할까요? R-Value를 참조하기 위해 약간 다른 참조 연산을 사용합니다.

int &&a = 1; // &&가 R-Value 참조 연산자이고 에러가 발생하지 않습니다.
L-Value 처럼 아래와 같은 코드도 가능합니다.
int a = 1;
int &&b = 2;
b = a; // b의 값이 1로 바뀝니다.


댓글 없음:

댓글 쓰기