Чи надає стандартна бібліотека C ++ 11 будь-яку утиліту для перетворення з а std::shared_ptrв std::unique_ptrабо навпаки? Це безпечна робота?
shared_ptr.
Чи надає стандартна бібліотека C ++ 11 будь-яку утиліту для перетворення з а std::shared_ptrв std::unique_ptrабо навпаки? Це безпечна робота?
shared_ptr.
Відповіді:
std::unique_ptrце спосіб С ++ 11 виразити ексклюзивне право власності, але однією з найпривабливіших його можливостей є те, що він легко і ефективно перетворюється на astd::shared_ptr.Це ключова частина того, чому
std::unique_ptrвін так добре підходить як тип повернення заводських функцій. Фабричні функції не можуть знати, чи бажаючі хочуть використовувати ексклюзивну семантику власності для об'єкта, який вони повертають, чиstd::shared_ptrбільш доцільним буде спільне володіння (тобто ). Повертаючи astd::unique_ptr, фабрики надають абонентам найефективніший інтелектуальний покажчик, але вони не заважають абонентам замінити його на більш гнучкий брат.
std::shared_ptrдоstd::unique_ptrзаборонено. Після того, як ви перетворили управління ресурсом на все життя на astd::shared_ptr, ви не передумаєте. Навіть якщо кількість посилань одна, ви не можете повернути право власності на ресурс, щоб, скажімо, мати правоstd::unique_ptrкерувати ним.Довідка: Ефективний сучасний C ++. 42 КОНКРЕТНІ СПОСОБИ ПОЛІПШЕННЯ ВАШОГО ВИКОРИСТАННЯ С ++ 11 І С ++ 14. Скотт Майерс.
Коротше кажучи, ви можете легко і ефективно перетворити a 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_ptra std::shared_ptr.
Враховуючи унікальний_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