(작성 중) Value Categories, R-Value Reference, Move Semantics & perfect forwarding
Value Categories
R-Value(Right-Value) & L-Value(Left-Value)
기존의 C언어에서 사용했던 R-Value와 L-Value의 개념을 간단하게 설명하자면,
문자 그대로 L-Value는 expression의 왼쪽에 오는 값을 말하며,
R-Value는 expression의 오른쪽에 오는 값을 말한다.
하지만 C++에서는 여러 기능들이 추가되면서 expression들이 좀더 세분화 되었다.
C++의 모든 expression은 Type또는 Value중 하나의 속성으로 구분된다.
각 expression중 일부는 비참조 유형일 수 있으며,
크게 3가지 Primary Value Categories로 나뉜다.
( Primary Value Categories : PR-Value, X-Value, L-Value )
GL-Value(Generalized L-Value)
- identity가 있다.
즉, 객체 또는 함수의 identity를 평가할 수 있는 expression을 말한다.
identity가 있다는 것은 expression이 끝나더라도 다시 접근할 수 있다는 의미이다.
변수명이 identity의 역할을 한다.
int a = 10;
int b = a*5;
/* a가 우측에 왔기 때문에 여기서는 R-value로 볼 수 있지만,
a*5 라는 expression에 대한 평가가 끝난 후에도 다시 a라는 변수명을 통해
접근할 수 있기 때문에 a는 identity가 있다고 말할 수 있다.
하지만 a*5이라는 expression의 연산 결과는 PR-value에 해당
*/
다시말하면 데이터를 저장할 메모리 주소 정보를
유저가 코드 상에서 가지고 있을 경우 identity가 있다고 볼수 있으며, 그것을 GL-Value라고 할 수 있다.
R-Value
- move될 수 있는 expression이다.
값이 메모리에서 이동 될 수 있는 것을 “move될 수 있다”라고 표현한다.
쉽게 이해하자면, 포인터가 있는 값은 주소를 이동할 수 있기 때문에 move될 수 있다.
- expression의 우측에 오는 값을 의미하며, PR-Value 와 X-Value를 말한다.
int i, j, k;
i = 7; // OK ( 변수는 identity를 가지고 있으므로 좌에 올 수 있다 )
7 = i; // 에러 : ( 7은 identity가 없는 임시 값이므로 PR-Value에 속하기 때문에 좌측에 올 수 없다 )
i*3 = 8; // 에러 : (i * 3은 내장 연산자에 의한 expression이므로 좌측에 올 수 없다)
k = i; // OK : ( 변수는 identity를 가지고 있으므로 우측에도 올 수 있다 )
((i < 3) ? i : j) = 7; // OK
// 삼항연산자 ((i < 3) ? i : j) 의 반환 값인 i, j는 identity를 가지고 있기 때문에 좌측에 올 수 있다
L-Value
- identity가 있고, move 될 수 없는 expression이다.
- expression의 좌측에 오는 값을 의미하며, X-Value가 아닌 GL-Value를 말한다.
PR-Value(Pure R-Value)
- identity가 없고, move 될 수 있는 expression이다.
- 내장된 연산자(Built-in Operator)로 피연산자 값을 계산하거나,
객체를 초기화하는 expression을 말한다.
X-Value ( X는 expiring을 의미 )
- identity가 있고, move 될 수 있는 expression이다.
- 리소스를 재사용(일반적으로 리소스의 수명이 거의 만료한 경우)할 수 있는 객체 또는 비트 필드를 나타내는 GL-Value를 말한다.
- R-Value Reference를 포함하는 특정 종류의 expression들은 X-Value를 산출한다.
예를 들면 return type이 R-Value Reference 또는 R-Value Reference로 캐스팅한 함수에 대한 호출 같은 것.
https://docs.microsoft.com/en-us/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=msvc-170
https://en.cppreference.com/w/cpp/language/value_category
https://psychoria.tistory.com/54
https://psychoria.tistory.com/59?category=556279
https://psychoria.tistory.com/60?category=556279
https://psychoria.tistory.com/61?category=556279