님이 하려고 했던 것은 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 들이 무브 되므로 정상적인 소유권 계승이 됨
이렇게까지 길게 설명할 필요가 있는 얘기인가 싶기는 하지만...
하여튼 그러하다
이거 사실임?
레퍼런스 없이 리턴할때는 알아서 우측값으로 취급할텐데 하두 안써서 헷갈림
읭 근데 이거 move 안 해도 컴파일이 되네 왜지
벡터자체가 rv라서 복사가 없어서 그런거일듯
벡터가 rv? 어째서 분명 로컬 스택 선인데여... gcc 에 최적화 옵션 안 걸었는데 알아서 캐스팅 해주는건가..
RVO
아 이 좃같은 언어 또 이러네...
누가 이런 끔찍한 언어를 만들었을까요..
답은 머다?
일단 확인 결과 이 글의 내용은 일부 틀림. 일단 질문하신분은 집에 가서 해보고 오류가 뜨면 알려주셈