표준 C언어의 관점에서 Lvalue와 Rvalue는 Left Value와 Right Value를 의미한다.
대입 연산자(=)를 기준으로 왼쪽에만 쓸 수 있는 값(variable)을 Lvalue라 하고, 오른쪽에만 쓸 수 있는 값(보통 상수) Rvalue라 한다.
하지만 C++ 표준에서는 Left/Right를 의미하지 않고, Lvalue/Rvalue를 그 자체로 보는 것이 맞다.
C++에서 Lvalue와 Rvalue의 의미는 다음과 같다.
- Lvalue
단일 표현식 이후에도 없어지지 않고 지속되는 객체 - Rvalue
표현식이 종료된 이후에는 더 이상 존재하지 않는 임시적인 값 - 예시
int x = 3;
const int y = x;
int z = x + y;
int *p = &x;
cout << string("one");
++x; // 증가된 x 자신을 리턴
x++; // 증가된 복사본을 리턴
Lvalue 참조자 &와 Rvalue 참조자 &&
- Lvalue 참조자 &
Lvalue만 참조할 수 있음 - Rvalue 참조자 &
Rvalue만 참조할 수 있음 - 예시
int x = 10;
int& a = x;
//int& b = 10; => error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
int&& c = 5;
//int&& d = a; => error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'ini'