L-value, R-value 는 c++11 이전과 이후로 개념을 다르게 잡는다.
c++11 이전에는 연산에서 왼쪽에 존재 할 수 있는 값, 오른쪽에 존재해야하는 값으로 L-value, R-value를 나눌 수 있다.
c++11 이후에도 맞는 말이지만 좀 더 추가된 개념이 있다.
lvaue
등호의 왼쪽과 오른쪽 전부 존재 가능
식별자를 가지고 있다.
해당 문장을 벗어난 후 사용 가능하다.
주소 연산자로 주소를 구할 수 있다.
참조를 리턴하는 함수.
rvalue
등호의 오른쪽에만 존재 가능.
식별자가 없다
해당 문장에서만 사용
주소 연산자로 주소를 구하는게 불가능하다.
value 를 리턴하는 함수, 임시객체 등등
int a = 0;
int b = 25;
// a,b 는 Lvalue로 식별자를 가지는 변수로 데이터를 복사해서 값을 변경가능하다.
// 0,25 는 Rvalue 이다.
0 = a;
a + b = 25;
sum() = 30; // 등등
// Rvalue 는 다른 데이터의 메모리를 복사할 공간이 없거나, 식별자가 없어 대입이 불가능.
c++11 이후에는 Lvalue를 Locaor Value 로 메모리를 식별할 수 있는지의 여부도 포함하게 되었다.
또한, const의 활용으로 메모리 주소를 파악하더라도 수정이 불가능한 Lvalue가 있게 되었다.
주소를 가지지만 수정 불가능한 Lvalue
배열, Const 등
Rvalue 는 식별자를 특정할 수 없는 데이터이다.
Rvalue reference
1. 일반 참조(&) 타입은 lvalue만 참조 가능
2. const 참조(&) 타입은 lvalue와 rvalue 둘 다 참조 가능
3. rvalue reference(&&) 는 rvalue만 참조 가능
4. move 와 perfect forwarding에서 사용
int main()
{
int a = 10;
// 일반 참조자는 lvalue 만 참조 가능
int& b1 = a;
int& b2 = 25; // 불가능
// const 참조자는 lvalue 와 rvalue를 모두 참조 가능
const int& b3 = a;
const int& b4 = 25;
// 참조는 가능하지만 상수성 때문에 값 변경 불가
const Mon& b = Mon(25); // 임시 객체의 attack 이 25
b.attack = 10; // 불가
// rvalue reference 는 rvalue 만 가리킬수 있다. C++11 이후 문법.
int&& b5 = a; // error
int&& b6 = 25; // ok.
}
'Cpp' 카테고리의 다른 글
콜백 함수 (0) | 2023.06.19 |
---|---|
허상 포인터(댕글링 포인터) (0) | 2023.06.19 |
스마트 포인터 (0) | 2023.06.13 |
얕은 복사 깊은 복사 (0) | 2023.06.13 |
함수 포인터 (0) | 2023.06.13 |