c, c++ 리마인드

Lvalue, Rvalue, &&

무한 나무 2023. 8. 23. 21:58

그냥 쉽고 짧게 생각하면,

Lvalue : Left value  왼쪽에 있는 값.

Rvalue : Right value 오른쪽에 있는 값.

 

(=) 기준으로 왼쪽에 있을 수 있는 값 / 오른쪽에 있을 수 있는 값이라는건데, 사실 Lvalue면 오른쪽에도 있을 수 있다.

 

 

왼쪽/오른쪽 기준으로 좀 더 생각해보면,

Lvalue : 값을 저장 할 수 있는 변수.

Rvalue :  상수.... 어찌됐든 데이터?

 

Lvalue가 되기 위해선 "이름"이 있어야하고, "공간의 위치"를 알 수 있어야한다.

Rvalue가 되기 위해선 아무튼간 ""이면 된다.

 

 

결국 정리하면,

Lvalue : "식별자"가 있고 "메모리 위치"를 알 수 있는 [변수,객체]로서 영속성인 것.

Rvalue : 상수값('1','2','3',.....)과 같은 "값"이지만 "메모리 위치"를 알 수 없고 휘발성인 것. 즉 임시인 것. 임시객체.

 

Lvalue는 변수로서 대입이 가능함.

Rvlaue는 대입 불가능.

 

 

&&

임시객체(Rvalue)를 받기위한 키워드. 복사생성자에 활용하는 듯 함.(이동생성자라고 하는 듯)

class RvalueTest
{
private:
	int data;
public:
    RvalueTest()
    {
    	//기본 생성자
    }
    
    RvalueTest(const RvalueTest& temp)
    : data(temp.data)
    {
    	//복사 생성자, 깊은 복사 수행
    }
    
    RvalueTest(RvalueTest&& temp)
    : data(temp.data)
    {
    	//임시객체를 받아 복사 생성자
        //=이동 생성자, 얕은 복사 수행
        //어차피 바로 사라질 데이터의 멤버를 그대로 이어받는 개념이 더 합리적
    }
};