기본적으로 Lvalue & Rvalue 에 대하여 말하고자 한다면
Left value = 왼쪽값 / Right value = 오른쪽값
으로 이해할수있다. 이는 대입 연산자 ( = ) 을 기준으로 방향에따라 왼쪽값 그리고 오른쪽값 으로 이해할 수 있다.
하지만 C++의 관점에서는 전혀 다른 해석을 해야 할 필요가 있기때문에 이에 대한 조사를 진행한다.
참조 : https://effort4137.tistory.com/entry/Lvalue-Rvalue
●C++ 에서의 Lvalue Rvalue 의 구분
C++ 에서 모든 표현식은 Lvalue 또는 Rvalue 이다.
Lvalue = 단일 표현식 이후에도 없어지지 않고 지속되는 객체.(즉, 이름을 가지는 객체/const 타입을 포함한 모든 변수)
Rvlaue = 표현식이 종료된 이후에는 더이상 존재하지않는 임시값.(즉, 상수 또는 임시객체)
아래의 코드 예제를 통하여 이해해 보도록 한다.
●코드 예제1
#include <iostream>
#include <string>
using namespace std;
int main()
{
int x = 3;
const int y = x;
int z = x + y;
int* p = &x;
cout << string("one");
++x;
x++;
}
Rvalue 는 굵은 밑줄로 표시되어있다.x, y, z, p 등의 이름을 가지는 변수는 모두 Lvalue 이지만,상수값 3, 임시객체 string("one") 은 표현식이 종료되면 더이상 참조할 수 없는 값이기 떄문에 Rvalue이다.x+y, &x 와 같은 표현식도 마찬가지이다.여기서 ++x 는 Lvalue 이지만, x++ 는 증가된 복사본을 리턴하기 때문에 Rvalue 로 볼 수 있다.
●코드 예제2
조금더 확실하게 구분하는 방법으로는표현식에 주소 연산자인 ( & ) 를 붙여보는 방법이 있다. ( & ) 연산자는 Lvalue 를 요구하기 떄문에 표현식이Rvalue 라면 컴파일 오류가 나게 된다.(아래 스크린샷 참조)
●Rvalue 참조자 &&
지금까지 C++ 에서 int& a = b; 의 형태로 사용하였던 참조자(Reference)는 Lvalue 의 참조자이다.
C++11 표준에서는 Lvalue 참조자 이외에도 Rvalue를 참조할 수 있는 Rvalue 참조자가 추가되었다.
이는 이름처럼 Lvalue 참조자는 같은 Lvalue 만 참조할 수 있고 Rvalue 참조자는 같은 Rvalue 만 참조할 수 있다.
Rvalue 참조자는 Visual Studio 2010 이상 버전의 컴파일러에서 사용 가능하다.
●코드 예제3
int rvalue()
{
return 10;
}
int main()
{
int lvalue = 10;
int& a = lvalue;
int& b = rvalue(); // error C2440: 'initializing' : cannot convert from 'int' to 'int &'
int&& c = lvalue; // error C2440: 'initializing' : cannot convert from 'int' to 'int &&'
int&& d = rvalue();
}
코드예제 3. 에서도 Lvalue 참조 타입에 Rvalue 를 대입하려하거나
Rvalue 참조 타입에 Lvalue 를 대입하려고 하면 컴파일 오류가 나는 것을 확인할 수 있다.
'공부' 카테고리의 다른 글
C++ 파라미터와 인자의 차이점 (1) | 2022.11.30 |
---|---|
C++ 샵&인벤토리 아이템 수량 추가 (0) | 2022.11.29 |
C++ 인벤토리 판매기능 추가 (0) | 2022.11.28 |
C++ 복사생성자 & 팩토리패턴 (0) | 2022.11.28 |
C++ 상점.인벤토리(추상화,가상함수 사용하기) (0) | 2022.11.27 |
댓글