Чи застаріло auto_ptr?


83
  1. Чи буде застарілим auto_ptr у вхідному стандарті C ++?
  2. Чи слід для передачі права власності використовувати замість shared_ptr унікальний_ptr?
  3. Якщо unique_ptr відсутній у стандарті, то чи потрібно мені замість цього використовувати shared_ptr?

Відповіді:


80

ОНОВЛЕННЯ: Ця відповідь була написана в 2010 році, і, як очікувалося std::auto_ptr, застаріла. Порада цілком слушна.

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

Вам слід спробувати використовувати розумний вказівник, який найкраще відповідає ситуації, вибір правильного типу вказівника надає іншим програмістам розуміння вашого дизайну.


22

Так, на сьогоднішній день auto_ptrбуде застарілим у C ++ 0x, і unique_ptrзамість цього слід використовувати . З останнього проекту стандарту (n3035), розділ D.9

Шаблон класу auto_ptrзастарілий. [Примітка: Шаблон класу unique_ptr(20.9.10) пропонує краще рішення. —Кінець примітки]

Поки стандарт не буде затверджений, завжди можливо, що комітет перегляне це рішення, хоча, на мою думку, це малоймовірне рішення.


18

У C ++ 11 (D.10, сторінка 1228) не лише auto_ptrзастаріло , але також буде видалено в наступній версії C ++ :

Прийнято N4190, а на самому ділі видалений (не просто застарілі) кілька архаїчних речей зі стандартної бібліотеки С ++, в тому числі 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він був "скопійований".


3

Ні, це не застаріло. Це може бути, якщо C ++ 0x коли-небудь буде прийнято. І це реально завжди буде підтримано. Я не вірю, що жодна застаріла функція ніколи не випадала із реальних реалізацій C ++.


5
Стандарт С ++ був оновлений лише один раз, і це, по суті, був лише технічний виправлення (тобто виправлений у згаданих проблемах). Не дивно, що це нічого не видалило. Отже, старі функції з часом випадають із компіляторів. Тільки для прикладу, більше, <iostream.h>ніж коли-небудь використано C ++ auto_ptr, але MS VC ++ (для одного) більше не надає.
Джеррі Коффін

1
@Jerry iostream.h ніколи не був частиною жодного стандарту. І як такий, він не є застарілим.

@Neil: Ні, але цим користувались дуже часто . auto_ptrє частиною стандарту, але використовується значно менше. З практичної точки зору, його видалення матиме значно менший вплив.
Джеррі Коффін

2
@Jerry добре, я багато використовую auto_ptr і взагалі не використовую iostream.h. Іноді я думаю, що стандартний комітет С ++ має трохи бджіл у своєму колективному капоті, коли йдеться про знецінення. Деякі речі, як оригінальні потокові рядки, очевидно, були помилковими, але іншим подобається ідея використання безіменних просторів імен замість цілком придатного для використання "статичного" ключового слова були (і є) цілком приємними.

1
@ Ніл: Ну, спробуймо поставити це в перспективі. Незалежно від того, що я роблю особисто, вважайте, що пошук у Google за запитом "<iostream.h>" приносить ~ 263'000 звернень, а те саме, що auto_ptr - ~ 66'000 звернень.
Джеррі Коффін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.