임시객체를 Knight& knight로 받을 수 없다.
사라질 녀석인데 TestKnight_LValueRef에서 수정하거나 할 수도 있기 때문에 => 좀 당연한 소리가 된다.
반면에 const Knight& knight는 받을 수 있음. => 이것도 좀 당연하게 const붙으면 수정을 할 수 없으니까 가능한거임.
Knight&& knight 이런식으로 사용을 함.
그러면 l-value는 이제 안되고
임시객체같은 r-value만
이런식으로 된다.
하지만 캐스팅으로 해주면 l-value도 넘길 수 있음.
이렇게하면 TestKnight_RValueRef함수에서도 수정이 가능함.
=> 그러면 Knight& k를 받는 거랑 Knight&& k를 받는 거랑 차이가 뭐임?
똑같은거 아닌가?
아니다.
Knight&& knight는 "원본을 유지 하지 않아도 된다는 장점"이 있다.
이게 "얕은 복사"
pet까지 다른 객체로 만들면 "깊은 복사"임.
이렇게 만들어 줄 수 있을 것임. 이게 "깊은 복사"임.
여기에서 원본을 유지하지 않는다는 말이 =>
이렇게 인자로 받은 녀석의 pet을 nullptr로 날려버릴 수 있음.
오른값참조 자체가 원본을 유지하지 않아도 된다는 힌트가 있기 때문이다.
Knight k2;
k2._pet = new Pet();
k2._hp = 1000;
Knight k3;
k3 = static_cast<Knight&&>(k2);
이렇게하면은 "이동 대입 연산자"가 호출이 됨.
이 연산자.
실제로는 static_cast 해서 사용하지 않고
std::move를 사용을 한다.
std::move가 등장을 하면은 오른값 참조로 캐스팅 한거임 즉,
t1 = std::move(t2) == t1 = static_cast<T&&>(t2);
이거임.
나중에 스마트 포인터의 unique_ptr에 유용하다.
uptr는 empty뜨고 모든것을 uptr2에게 다 넘겨줌.