int a = 3; 에서 a는 왼값(lvalue), 3은 오른값(rvalue)이다.
왼값이란 단일 식을 넘어 계속 지속되는 개체이고
오른값이란 왼값이 아닌 나머지이다. (임시 값, 열거형, 람다, i++ 등)
다음은 참조 방법에 대해 알아보자.
void Copy_RValueRef(Player&& player){}
오른값 참조를 사용할 때는 &을 연속해서 두개 붙인다.
그러면 rvalue을 참조할 것이며 rvalue는 우리 마음대로 수정이 가능하고 lvalue처럼 지속되지도 않는다.
그래서 위 코드에서 매개변수로 받은 rvalue player을 nullptr로 설정할 수 있다.
이런 특성 때문에 복사가 아니라 이동이 가능해진다.
void operator=(Player&& player)
{
//깊은 복사
//if(player._pet)
//_pet = new Pet(player._pet);
//이동
_pet = player._pet;
player = nullptr;
}
원래는 참조 값을 매개변수로 받으면 깊은 복사를 진행해야 하지만 rvalue를 매개변수로 받으면
사라질 것을 알기 때문에 얕은 복사가 가능하고 nullptr로 설정할 수 있다. 그래서 복사가 아닌 이동이라고 한다.
데이터를 rvalue로 캐스팅해서 오른값 참조를 사용할 수 있는데 std::move를 사용하면 된다.
이 함수는 하나만 존재해야 하는 unique_ptr의 이동에도 사용된다.
'C++' 카테고리의 다른 글
| [C++] 전역 변수, 정적 변수, 외부 변수 (0) | 2022.12.23 |
|---|---|
| [C++] 람다 (0) | 2022.06.25 |
| [C++] 사용하지 않는 함수 삭제하기 (0) | 2022.06.25 |
| [C++] enum vs enum class (0) | 2022.06.25 |
| [C++] typedef보다 using을 사용하자. (0) | 2022.06.25 |