C ++ 11 unique_ptr 및 shared_ptr이 서로의 유형으로 변환 할 수 있습니까? 반대로 변환 할 수있는 유틸리티를 제공

C ++ 11 표준 라이브러리는 a std::shared_ptr에서 std::unique_ptr로 또는 그 반대로 변환 할 수있는 유틸리티를 제공 합니까? 이것이 안전한 작업입니까?



답변

std::unique_ptr독점 소유권을 표현하는 C ++ 11 방식이지만 가장 매력적인 기능 중 하나는 쉽고 효율적으로 std::shared_ptr.

이것이 std::unique_ptr팩토리 함수 리턴 유형으로 적합한 이유의 핵심 부분입니다 . 팩토리 함수는 호출자가 반환하는 객체에 대해 배타적 소유권 의미 체계를 사용 하려는지 또는 공유 소유권 (예 🙂 std::shared_ptr이 더 적절한 지 여부를 알 수 없습니다 . 를 반환함으로써 std::unique_ptr팩토리는 호출자에게 가장 효율적인 스마트 포인터를 제공하지만 호출자가 더 유연한 형제로 대체하는 것을 방해하지 않습니다.

std::shared_ptr에가 std::unique_ptr허용되지 않습니다. 리소스의 평생 관리를으로 전환하면 std::shared_ptr마음이 바뀌지 않습니다. 참조 횟수가 1이더라도 리소스를 관리하기 위해 리소스 소유권을 되 찾을 수 없습니다 std::unique_ptr.

참조 : 효과적인 최신 C ++. 42 C ++ 11 및 C ++ 14 사용을 개선하는 구체적인 방법. 스콧 마이어스.

즉, 당신은 쉽고 효율적으로 변환 할 수 있습니다 std::unique_ptrstd::shared_ptr하지만 당신은 변환 할 수 없습니다 std::shared_ptrstd::unique_ptr.

예를 들면 :

std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);

또는:

std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");


답변

unique_ptr u_ptr이 주어지면 shared_ptr s_ptr을 만듭니다.

std::shared_ptr<whatever> s_ptr(u_ptr.release());

다른 길로가는 것은 비현실적입니다.


답변