Auto_ptr устарел? - PullRequest
       47

Auto_ptr устарел?

75 голосов
/ 08 марта 2010
  1. Будет ли устаревать auto_ptr во входящем стандарте C ++?
  2. Следует ли использовать unique_ptr для передачи права собственности вместо shared_ptr?
  3. Если unique_ptr не входит в стандарт, нужно ли мне использовать shared_ptr вместо этого?

Ответы [ 4 ]

73 голосов
/ 08 марта 2010

ОБНОВЛЕНИЕ: Этот ответ был написан в 2010 году и, как и ожидалось, std::auto_ptr устарел. Совет полностью действителен.

В C ++ 0x std::auto_ptr будет устаревшим в пользу std::unique_ptr. Выбор интеллектуального указателя будет зависеть от вашего варианта использования и ваших требований: std::unique_ptr с семантикой перемещения для одного владельца, которую можно использовать внутри контейнеров (с использованием семантики перемещения), и std::shared_ptr при совместном владении.

Вы должны попытаться использовать интеллектуальный указатель, который наилучшим образом соответствует ситуации, выбор правильного типа указателя дает другим программистам понимание вашего дизайна.

20 голосов
/ 08 марта 2010

Да, с сегодняшнего дня auto_ptr устарело в C ++ 0x, и вместо него следует использовать unique_ptr. Из последнего проекта стандарта (n3035), раздел D.9

Шаблон класса auto_ptr устарел. [Примечание: шаблон класса unique_ptr (20.9.10) обеспечивает лучшее решение. —Конечная записка]

До тех пор, пока стандарт не будет ратифицирован, всегда возможно, что комитет пересмотрит это решение, хотя я считаю, что это решение маловероятно.

14 голосов
/ 24 ноября 2014

Не только 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 копируется.

4 голосов
/ 08 марта 2010

Нет, это не устарело. Это может быть, если C ++ 0x когда-либо будет принят. И это реально всегда будет поддерживаться. Я не верю, что какая-либо устаревшая функция была исключена из реальных реализаций C ++.

...