tmdahr1245   2년 전

Modern C++ 에서 Move Semantics과 스마트포인터를 공부하던 도중 궁금한게 있어서 질문드립니다.

Move Semantics에서 사용되는 move 함수는 단순히 L-Value 또는 R-Value를 R-Value로 강제 캐스팅한다고 알고있고

실제 이동연산은 따로 구현해줘야 한다고 알고있습니다.

그런데 스마트포인터 사용시 

unique_ptr<int> ptr(new int(1));

auto ptr2 = move(ptr);

이렇게 사용하면 소유권 이동이되어 ptr을 사용할수 없게 되는데 move 함수만으로는 이동연산이 수행되지 않는다고 알고있어서...

결국 제 생각으로 스마트 포인터에 R-Value로 생성되면 스마트포인터 클래스 내에서 이미 이동생성자가 구현되어 

클래스 내에서 이동연산을 수행해준다고 밖에 생각이 들지않는데...

결론은 스마트 포인터 사용시 move 함수를 통해 소유권이 이전되는 원리에 대해서 질문드립니다!

bupjae   2년 전

unique_ptr 은 copy constructor 및 copy assignment 를 구현하고 있지 않기 때문에 일반적인 ptr2 = ptr; 은 오류를 내뱉습니다.

반면, unique_ptr 은 move constructor 및 move assignment 를 구현하고 있습니다. 이렇게 되면 ptr2 = move(ptr); 과 같이 우변이 rvalue인 채로 대입하면 move assignment 가 호출됩니다.

unique_ptr의 move constructor 및 move assignment 의 내부구현을 거칠게 설명하자면 (rvalue로 변해서 넘어온) 인자가 가리키고 있었던 (= 소유하고 있던) 객체를 이제부터는 자기 자신이 가리키도록 하고, 인자는 아무것도 가리키지 않는 상태로 변경합니다.

댓글을 작성하려면 로그인해야 합니다.