Предоставляет ли стандартная библиотека C ++ 11 какие-либо утилиты для преобразования из a std::shared_ptr
в std::unique_ptr
или наоборот? Это безопасная операция?
shared_ptr
.
Предоставляет ли стандартная библиотека C ++ 11 какие-либо утилиты для преобразования из a std::shared_ptr
в std::unique_ptr
или наоборот? Это безопасная операция?
shared_ptr
.
Ответы:
std::unique_ptr
- это способ выражения исключительного владения в C ++ 11, но одной из самых привлекательных его особенностей является то, что он легко и эффективно преобразуется вstd::shared_ptr
.Это ключевая часть того, почему
std::unique_ptr
он так хорошо подходит в качестве возвращаемого типа заводской функции. Фабричные функции не могут знать, захотят ли вызывающие стороны использовать семантику исключительного владения для возвращаемого объекта, или совместное владение (т. Е.std::shared_ptr
) Будет более подходящим. Возвращая astd::unique_ptr
, фабрики предоставляют вызывающим объектам наиболее эффективный интеллектуальный указатель, но они не мешают вызывающим объектам заменить его более гибким аналогом.
std::shared_ptr
кstd::unique_ptr
не допускается. После того, как вы перешли на управление жизненным циклом ресурсаstd::shared_ptr
, вы уже не передумаете. Даже если количество ссылок равно единице, вы не можете вернуть себе право собственности на ресурс, чтобы, скажем,std::unique_ptr
управлять им.Ссылка: Эффективный современный C ++. 42 СПОСОБА УЛУЧШИТЬ ИСПОЛЬЗОВАНИЕ C ++ 11 И C ++ 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");
std::unique_ptr
для std::shared_ptr
.
std::unique_ptr
на a std::shared_ptr
? Стандартная библиотека определяет оператор присваивания перемещения template<class Y, class Deleter> shared_ptr& operator=(std::unique_ptr<Y, Deleter>&& r);
для std::shared_ptr<T>
.
Учитывая unique_ptr u_ptr, создайте shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Идти другим путем нецелесообразно.
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
хранится внутриunique_ptr