자세한 내용은 여기 참고하면 좋을 거 같다.
https://blog.seulgi.kim/2017/06/cpp11-value-category
lvalue 란?
- 단일 식을 넘어 지속되는 개체
- 주소가 있음
- 이름이 있는 변수
- const 변수
- 배열 변수
- 비트 필드
- 공용 구조체
- 클래스 멤버
- 좌측 값 참조&로 반환하는 함수 호출
- 문자열 리터럴
rvalue 란?
- lvalue 가 아닌 개체
- 사용되는 단일 식을 넘어 지속되지 않는 일시적인 값
- 주소가 없는 개체
- 리터럴 (문자열 리터럴 제외)
- 참조로 반환하지 않는 함수 호출
- i++, i--
- 기본으로 지원되는 산술식, 논리식, 비교식
- 열거형 (enum)
- 람다(lambda)
예시)
int number = 10; // number는 lvalue
int* pNumber = &number // pNumber는 lvalue
const int NUMBER_MAX = 20; // NUMBER_MAX는 lvalue
const char* name = "dracula" // name, "dracula"는 lvalue
int number = 10; // 10은 rvalue
10 = number; // 10은 rvalue이기 때문에 error
(number + 5) = 10; // (number + 5)는 rvalue이기 때문에 error
int number2 = 20;
int sum = number + number2; // number + number2는 rvalue
if(number < number2) // number < number2 는 rvalue
int zero = 0;
int& reference = zero; // reference lvalue 참조
int& reference2 = 0; // 0은 rvalue, reference2 는 lvalue 참조기 때문에 error
에러 메세지
invalid initialization of non-const reference of type int& from an rvalue of type ‘int’