Auto_ptr устарел?

  1. Будет ли auto_ptr объявлен устаревшим во входящем стандарте C++?
  2. Следует ли использовать unique_ptr для передачи права собственности вместо shared_ptr?
  3. Если 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++.

Другие вопросы по тегам