2016-06-17 5 views
23

Имеет ли стандартная библиотека C++ 11 любую утилиту для преобразования из std::shared_ptr в std::unique_ptr или наоборот? Это безопасная операция?Имеет ли C++ 11 unique_ptr и shared_ptr возможность конвертировать друг в друга?

+0

Определите, пожалуйста, безопасную операцию. Какую безопасность вы ищете? безопасность жизни? Безопасность резьбы? – jaggedSpire

+0

«STL» не означает стандартную библиотеку. STL не имеет ничего общего с 'shared_ptr'. – curiousguy

+0

@jaggedSpire Безопасность нити означала бы, что у вас есть владельцы, используемые в разных потоках, т. Е. Количество использования не равно 1. – curiousguy

ответ

36

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

Это ключевая часть, почему std::unique_ptr настолько хорошо подходит как тип возврата заводской функции. Фабричные функции не могут знать, будут ли вызывающие абоненты использовать эксклюзивную семантику собственности для возвращаемого им объекта или будет ли более приемлемым совместное использование (т. Е. std::shared_ptr). Вернув std::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"); 
+5

... Как вы это делаете? – Jake

+1

@ Jake Я добавил пример – chema989

0

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

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

Переход в другую сторону нецелесообразно.

+13

Вот «правильный» способ: 'std :: shared_ptr s_ptr (std :: move (u_ptr));' – emlai

+0

И вот педантичный «правильный» способ: 'std :: shared_ptr s_ptr {std :: move (u_ptr)}; ' – polyvertex

 Смежные вопросы

  • Нет связанных вопросов^_^