Имеет ли С++ 11 unique_ptr и shared_ptr возможность конвертировать друг в друга?

Стандартная библиотека С++ 11 предоставляет любую утилиту для преобразования из std::shared_ptr в std::unique_ptr или наоборот? Это безопасная операция?

Ответы

Ответ 1

std::unique_ptr - это способ С++ 11 для выражения эксклюзивной собственности, но один из его наиболее привлекательными функциями являются то, что он легко и эффективно преобразуется в std:: shared_ptr.

Это ключевая часть, почему std::unique_ptr настолько хорошо подходит как возвращаемый тип функции factory. factory функции не могут знать, будут ли вызывающие абоненты использовать эксклюзивную семантику собственности для возвращаемого им объекта или будет ли более предпочтительным совместное использование (т.е. std::shared_ptr). Возвращая std::unique_ptr, фабрики предоставляют вызывающим абонентам наиболее эффективный интеллектуальный указатель, но они не мешают абонентам заменить его более гибким братом.

std::shared_ptr до std::unique_ptr не разрешено. Как только вы вернули управление ресурсом ресурса до std::shared_ptr, theres не изменит ваш разум. Даже если счетчик ссылок один, вы не можете вернуть ресурс, чтобы, скажем, управлять std::unique_ptr.

Ссылка: Эффективный современный С++. 42 СПЕЦИФИЧЕСКИЕ СПОСОБЫ УЛУЧШЕНИЯ ВАШЕГО ИСПОЛЬЗОВАНИЯ С++ 11 И С++ 14. Скотт Майерс.

Короче говоря, вы можете легко и эффективно конвертировать std::unique_ptr в std::shared_ptr, но вы не можете преобразовать std::shared_ptr в std::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");

Ответ 2

Учитывая unique_ptr u_ptr, создайте shared_ptr s_ptr:

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

Переход другим способом непрактичен.