Предоставляет ли стандартная библиотека 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