커스텀 컨테이너를 제작하는 중에, rvalue reference의 필요성을 느껴서 이에 대해서 알아본 내용을 적어보고자한다.
개요
rvalue reference에 대해서 이해하려면 rvalue와 lvalue를 먼저 이해해야한다. 이 둘에 대해서 가볍게 알아보고 본문에서 다루고자했던 내용을 다루도록 하겠다.
rvalue reference는 일반적인 상황에서는 마주할 일이 거의 없지만 객체를 설계하는 입장에서는 알아둬야 할 내용이라고 생각한다.
이제 세부적으로 살펴보자.
rvalue, lvalue란 무엇인가?
C++의 expression은 다음 3가지 분류로 나누어진다.
- prvalue
- xvalue
- lvalue
이때 xvalue와 prvalue는 모두 rvalue에 해당한다. 따라서 크게 xvalue, rvalue 두 가지로 분류된다.
prvalue는 ‘pure’ rvalue를 의미한다.
이 둘의 차이는 뭘까? 코드를 보면 직관적으로 확인할 수 있다.
다음 코드에서 변수 a는 lvalue이고 리터럴 값 4는 rvalue이다.
a = 4이때, lvalue는 이미 메모리에 이미 공간을 차지한 상태로 존재한다. 하지만 rvalue는 연산을 위해 임시 메모리를 할당받는다는 차이를 가진다.
그럼 xvalue는 무엇일까?
다음 코드를 살펴보자.
int a;
int &&b = std::move(a)여기서 변수 a는 메모리가 이미 존재하지만, std::move연산으로 lvalue로 rvalue referece변수인 b에 값을 전달한다.
std::move가 어떻게 동작하는지 궁금하다면 std;;move는 어떻게 값을 lvalue로 만들까 참조.
이전에 살펴본 예시의 4는 임시메모리가 할당되는 prvalue에 해당한다.
보다 상세한 해설을 원한다면 다음 문서를 참고하자.
https://en.cppreference.com/cpp/language/value_category
먼저 예시를 살펴보자.
int&& a = 5; // valid
int&& b = x + 2; // valid
int&& c = someFunc(); // valid if someFunc() returns by valueBut:
int x = 10;
int&& r = x; // ❌ Error! x is an lvalue, not rvalue위 둘의 차이가 뭘까? 하나는 r-value 즉, 임시 변수로써 값이 존재하며 이를 copy가 아니라 reference할 수 있다.
따라서 &&의 의미는 ‘임시 변수’를 ‘참조’하는 변수라고 볼 수 있겠다.
반대로 이렇게 쓰이는 경우도 있는데
int&& a = 10;
int b = a;변수 a가 reference로 값을 가지기는 하지만 이름을 가졌으므로 이는 l-value로 취급되어 copy가 이루어지게 된다.
따라서 b의 할당에 한에서는 아래와 같이 동작한다고 할 수 있다.
int a = 10;
int b = a;