[Modern C++] R-Value L-Value

R-Value L-Value

rvalue와 lvalue는 C++11에서부터 개념이 중요해지게 되었다. Rvalue와 Lvalue는 다음과 같이 정의할 수 있다.

Lvalue

Lvalue는 객체를 참조하는 표현식이며 메모리를 보유한다.

Ravlue

Rvalue는 Lvalue가 아닌 표현식이다. 즉 식별 가능한 메모리 영역을 보유하는 객체를 반드시 나타내는것이 아니며 임시적이다.

Features

  1. 숫자나 문자와 같은 리터럴은 Rvalue이다.
  2. Enum 또한 Rvalue이다.
  3. 이항 연산자(+)의 결과는 항상 Rvalue이다.
  4. 단항 연산자(&)는 Lvalue를 필요로 한다. 하지만 결과값은 Rvalue다.
  5. 포인터는 결과로 Lvalue를 만들어 준다. 예를들어 Non-null pointer는 항상 유효한 객체를 가리킨다.
  6. 전위 연산 표현식의 결과는 Lvalue이다.
  7. 참조는 단순히 이름이기 때문에 Rvalue에 묶인 참조 자체는 Lvalue이다.
  8. Rvalue는 임시적이고 메모리 영역을 가리킬 필요가 없지만 어떤 경우에는 메모리를 가르켜야할 상황이 온다. 이런 상황은 권장하지 않는다.
  9. 후위 연산 표현식의 결과는 Rvalue이다.
  10. 함수 호출은 결과 유형이 참조인 경우 Lvalue를 리턴한다.
1
2
3
4
5
6
7
8
9
10
// returning reference to make the function call an Lvalue
int& GetBig(int& a, int& b){
return ( a > b ? a : b );
}

void main() {
int i = 10, j = 50;
GetBig( i, j ) *= 5;
// Here, j = 250. GetBig() returns the ref of j and it gets multiplied by 5 times.
}
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/07/21/Languages/Cplusplus/rvalue_lvalue/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.