L-Value는 Left Value, R-Value는 Right Value의 약자이다. 일반적으로, =
을 기준으로 좌우라고 생각할 수도 있지만, 그리고 C언어에서는 실제로 그렇지만, C++에서는 전혀 그렇지 않다.
C++에서 정의되는 L-Value, R-Value는 다음과 같다.
L-Value
구체적인 메모리 주소를 가리키는 값을 의미한다. Variable, Array element가 l-value에 해당한다. 표현식 이후에도 계속 살아있다.
R-Value
구체적인 메모리 주소를 가지고 있지 않다. 상수 등이 r-value에 해당된다. 표현식 이후에는 없어진다.
아래와 같은 코드가 있다고 했을 때,
int a = 3;
a
는 l-value이고, 3
은 r-value이다.
l-value는 r-value가 될 수 있다. 하지만, r-value는 l-value가 될 수 없다. 아래의 예를 보자.
int a = 3;
int* b = &a; // b : l-value
int x = 1; // x : l-value
int y = 2; // y : l-value
int z = x + y; // x+y : r-value, z : l-value
++z; // l-value
z++; // r-value;
다음과 같은 경우에는 error가 발생한다.
int a;
3 = a; // error
int* b = &3; // error
Move semantics나 R-Value reference와 같은 심화 개념은 추후 다룰 예정이다.