[C++11] R-Value 레퍼런스
C++11
/ Programming
|
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는 참조가 불가능합니다.
대충 이해가 가시나요? 값을 참조하는 경우를 살펴봅시다.
그런데 C++11에서 R-Value를 참조 가능하게 만들었습니다. 이동 시맨틱과 퍼펙트 포워딩을 위해 적용한 개념이라고 합니다. 이동 시맨틱과 퍼펙트 포워딩은 추후 정리하겠습니다.
그럼 R-Value를 어떻게 참조할까요? 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 참조 연산자이고 에러가 발생하지 않습니다. |
int a = 1; int &&b = 2; b = a; // b의 값이 1로 바뀝니다. |
댓글 없음:
댓글 쓰기