Является ли 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 когда-либо принимается. И это будет реально поддерживать. Я не верю, что любая устаревшая функция когда-либо была удалена из реализаций реализаций на С++.