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)
{
//임시객체를 받아 복사 생성자
//=이동 생성자, 얕은 복사 수행
//어차피 바로 사라질 데이터의 멤버를 그대로 이어받는 개념이 더 합리적
}
};