Ответ 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");