C++/C++

(작성 중) Value Categories, R-Value Reference, Move Semantics & perfect forwarding

Elan 2021. 12. 17. 02:57

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 )

 C++ Value Categories

 

 

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