C++에서 모든 표현식은 L-value와 R-value로 분류된다.
표현식의 왼쪽에 오는 값으로, 메모리 주소를 가지는 참조 가능한 객체이다.
표현식의 오른쪽에 오는 값으로, 메모리 주소가 없는 일시적으로 생성되는 값이다.
대표적으로 숫자, 문자 또는 연산 결과, 함수 반환값 등을 사용한다.
int x = 10; // x : L-value, 10 : R-value
x = 20; // x : L-value : x, 20 : R-value
만약, 표현식의 오른쪽에 포인터 변수가 들어온다면, 양쪽 모두 참조가 가능하기 때문에 둘다 L-value가 될 것이다. 하지만 변수는 L-value이지만, R-value context를 통해 R-value처럼 사용할 수 있다.
int* a = new int(1); // a : L-value, new int(1) : R-value
int* b = a; // b, a : L-value이지만, a가 대입의 오른쪽에 있기 때문에 R-value처럼 사용 가능하다.