오늘은 L-Value, R-Value에 대해 공부하겠습니다.
L-Value
https://docs.microsoft.com/ko-kr/cpp/c-language/l-value-and-r-value-expressions?view=msvc-170
마이크로소프트의 공식 문서를 보면 L-Value는 메모리 위치를 참조하는 식을 의미한다고 합니다.
왜 L이 되었는가 하면 메모리 주소를 참조한다는 뜻에서 Location의 앞글자, 또는 주로 코드에서 = 을 기준으로
왼쪽에 위치한다고 해서 Left Value라 해 L Value가 되었다는것 같습니다.
그리고 주로 L Value가 변수, 함수, 클래스 등을 나타내는 식별자를 의미 합니다.
R-Value
"모든 L Value는 R Value지만 R Value는 L Value가 아닐수 있다."
마이크로소프트 공식 문서를 보면서 제일 먼저 눈에 들어오는 문장입니다.
int v = 1;
v = 1 + v;
위 C++ 코드에서 첫줄의 v는 L Value이며 R Value는 상수인 20입니다. 정확히는 v가 가르키는 메모리 주소에 20이 들어가는 형식입니다.
그리고 2번쨰 v는 = 왼쪽에 있는 v 는 여전히 L Value 이지만 20 + v 는 그 자체가 (20 + v)이라는 임시 값 이기 때문에 R Value입니다.
int a = foo();
위에 코드는 foo()가 R Value입니다. 이러므로 R Value는 어떤 상태인지 예상을 해볼수 있는데 R Value는 해당 표현식이 끝나면 더이상 참조할 수 없는 값을 의미합니다.
& , &&?????
기존 &(Reference)를 사용하면 L Value의 참조자를 만들 수 있습니다.
int v = 2;
int& ref = v;
이런 식으로 L Value에 대해 참조자를 만들 수 있습니다. 이것은 참조자를 사용하는 방법으로 전에 포인터 레퍼른스 차이를 통해 다아는 방법이였습니다. 하지만 C++11 표준에서 &&가 추가되여 R Value에 대해서도 참조자를 만들 수 있게 됩니다.
int foo()
{
return 5;
}
int main()
{
int&& c = foo();
cout << c;
return 0;
}
이런 식으로 하면 R Value에 대해서 참조자를 만들 수 있게 됩니다.
'개발자 면접 공부 > C-C++' 카테고리의 다른 글
Struct vs Class (0) | 2022.08.03 |
---|---|
(C++) 이동생성자(Move Constructor) (0) | 2022.08.02 |
C++ 스마트 포인터(Unique, Shared, Weak) (0) | 2022.07.19 |
C++ 캐스팅의 종류 (0) | 2022.07.14 |
C++ RTTI 에 대해 (0) | 2022.07.14 |