오른값 참조

CJB_ny·2022년 12월 2일
0

C++ 정리

목록 보기
90/95
post-thumbnail

rvalue ref

임시객체를 Knight& knight로 받을 수 없다.

사라질 녀석인데 TestKnight_LValueRef에서 수정하거나 할 수도 있기 때문에 => 좀 당연한 소리가 된다.

반면에 const Knight& knight는 받을 수 있음. => 이것도 좀 당연하게 const붙으면 수정을 할 수 없으니까 가능한거임.

1. 사용방법

Knight&& knight 이런식으로 사용을 함.

그러면 l-value는 이제 안되고

임시객체같은 r-value만

이런식으로 된다.

하지만 캐스팅으로 해주면 l-value도 넘길 수 있음.

이렇게하면 TestKnight_RValueRef함수에서도 수정이 가능함.

=> 그러면 Knight& k를 받는 거랑 Knight&& k를 받는 거랑 차이가 뭐임?

똑같은거 아닌가?

아니다.

Knight&& knight는 "원본을 유지 하지 않아도 된다는 장점"이 있다.

2. 원본을 유지 하지 않는다?

이게 "얕은 복사"

pet까지 다른 객체로 만들면 "깊은 복사"임.

이렇게 만들어 줄 수 있을 것임. 이게 "깊은 복사"임.

이동 생성자 && 이동 대입 연산자

여기에서 원본을 유지하지 않는다는 말이 =>

이렇게 인자로 받은 녀석의 pet을 nullptr로 날려버릴 수 있음.

오른값참조 자체가 원본을 유지하지 않아도 된다는 힌트가 있기 때문이다.

3. 예시

Knight k2;
k2._pet = new Pet();
k2._hp = 1000;

Knight k3;
k3 = static_cast<Knight&&>(k2);

이렇게하면은 "이동 대입 연산자"가 호출이 됨.

이 연산자.

4. 실제 사용

실제로는 static_cast 해서 사용하지 않고

std::move를 사용을 한다.

std::move가 등장을 하면은 오른값 참조로 캐스팅 한거임 즉,

t1 = std::move(t2) == t1 = static_cast<T&&>(t2);

이거임.

나중에 스마트 포인터의 unique_ptr에 유용하다.

uptr는 empty뜨고 모든것을 uptr2에게 다 넘겨줌.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글