님이 하려고 했던 것은 std::unique_ptr 를 담은 std::vector 를 반환하는건데,

기본적으로 객체의 반환은 복사라는 것은 알고 있겠쥐?


그러면 std::vector를 복사할 때 할당된 각 공간의 데이터도 새 벡터로 그대로 복사가 됨

그렇다는 것은? std::unique_ptr 1 에서 std::unique_ptr 2 로 복사가 된다는 얘기겠지?


라는 것은 무엇일까

같은 저장공간을 가리키는 std::unique_ptr 이 비록 하나는 금방 사라질 예정이지만 2개가 생긴다는 얘기

std::unique_ptr 은 오로지 하나만 존재 (유일 소유권)할 수 있기 때문에 여기서 문제가 발생하는거


이거는 벡터를 반환할 때 뿐만 아니라,

그냥 return std::unique_ptr 를 할 때도 금지임


그대신 std::unique_ptr 은 소유권의 계승이 가능

따라서 std::move(std::unique_ptr)를 하면 반환을 하는 필드에서 포인터는 이름이 뺏겨서 소리소문 없이 사라지고,

반환 받는 곳으로 move 되어서 소유권이 계승됨


따라서 벡터 반환을 할 때도 마찬가지로 std::move(std::vector<std::unique_ptr>) 를 하면

모든 unique_ptr 들이 무브 되므로 정상적인 소유권 계승이 됨




이렇게까지 길게 설명할 필요가 있는 얘기인가 싶기는 하지만...

하여튼 그러하다