"메모리에 주소가 있느냐 없느냐"가 핵심!
C++을 공부하다 보면 꼭 등장하는 개념이 있습니다.
바로 lvalue와 rvalue인데요.
이 두 가지는 단순한 이론이 아니라, 참조, 복사, 이동, 성능 최적화와 관련된 매우 중요한 핵심 개념입니다.
메모리상에 주소가 존재하는 값
즉, 변수처럼 이름이 있고, 수정하거나 참조할 수 있는 값이 lvalue입니다.
int x = 10; // x는 lvalue → 메모리에 주소가 있음
x = 20; // OK! 값을 바꿀 수 있음
&) 가능일시적으로 존재하는 값, 주소가 없음
10, x + y, func()처럼 임시로 생성되어 곧 사라질 값이 rvalue입니다.
int y = x + 10; // (x + 10)은 rvalue, y는 lvalue
C++은 lvalue와 rvalue를 구분해서 다음과 같은 것을 결정합니다:
| 구분 | 설명 |
|---|---|
int& | lvalue 참조: 변수처럼 존재하는 것만 가능 |
int&& | rvalue 참조: 임시값만 받을 수 있음 |
| 이동 시멘틱스 | rvalue를 활용해서 복사를 피하고 성능 향상 |
| 구분 | 의미 | 예시 | 주소 있음 | 참조 가능 |
|---|---|---|---|---|
| lvalue | 이름 있는 변수, 존재함 | x, arr[0] | ✅ 있음 | ✅ 가능 |
| rvalue | 임시값, 사라질 값 | 10, x + 3, func() | ❌ 없음 | ❌ 직접 불가 (단, &&로는 가능) |
int a = 5; // a는 lvalue
int b = a + 3; // (a + 3)은 rvalue
int& ref1 = a; // OK: lvalue 참조
int& ref2 = a + 3; // ❌ 에러: rvalue는 lvalue 참조 불가
int&& ref3 = a + 3; // OK: rvalue 참조