Auto_ptr устарел?
- Будет ли auto_ptr объявлен устаревшим во входящем стандарте C++?
- Следует ли использовать unique_ptr для передачи права собственности вместо shared_ptr?
- Если unique_ptr не входит в стандарт, нужно ли мне использовать shared_ptr?
4 ответа
ОБНОВЛЕНИЕ: Этот ответ был написан в 2010 году и, как и ожидалось std::auto_ptr
был объявлен устаревшим Совет полностью действителен.
В C++0x std::auto_ptr
будет устаревшим в пользу std::unique_ptr
, Выбор умного указателя будет зависеть от вашего варианта использования и ваших требований, с std::unique_ptr
с семантикой перемещения для одного владельца, которая может использоваться внутри контейнеров (с использованием семантики перемещения) и std::shared_ptr
когда собственность разделена.
Вы должны попытаться использовать интеллектуальный указатель, который лучше всего соответствует ситуации, выбор правильного типа указателя дает другим программистам понимание вашего дизайна.
Да, на сегодня auto_ptr
будет устаревшим в C++0x, и вы должны использовать unique_ptr
вместо. Из последнего проекта стандарта (n3035), раздел D.9
Шаблон класса
auto_ptr
устарела. [Примечание: шаблон классаunique_ptr
(20.9.10) предоставляет лучшее решение. —Конечная записка]
До тех пор, пока стандарт не будет ратифицирован, всегда возможно, что комитет пересмотрит это решение, хотя я считаю, что это решение маловероятно.
Не только auto_ptr
устарело в C++11 (D.10, стр. 1228), оно также будет удалено в будущей версии C++:
Принято N4190 и фактически удалено (не только устарело) несколько архаичных вещей из стандартной библиотеки C++, включая
auto_ptr
,bind1st
/bind2nd
,ptr_fun
/mem_fun
/mem_fun_ref
,random_shuffle
и еще несколько. Теперь они все удалены из черновой стандартной библиотеки C++17 и не будут частью будущего переносимого C++.
Еще один документ об этом: язык программирования C++, рабочая группа по развитию библиотек - документ N4190, если вам нужна дополнительная информация.
Вы можете конвертировать любой код используя auto_ptr
автоматически, используя unique_ptr
вместо:
Любой код, использующий
auto_ptr
может быть механически преобразован в использованиеunique_ptr
, сmove()
вставляется всякий раз, когдаauto_ptr
был "скопирован".
Нет, это не рекомендуется. Это может быть, если C++0x когда-либо будет принят. И это реально всегда будет поддерживаться. Я не верю, что какая-либо устаревшая функция была исключена из реальных реализаций C++.