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