- Чи буде застарілим auto_ptr у вхідному стандарті C ++?
- Чи слід для передачі права власності використовувати замість shared_ptr унікальний_ptr?
- Якщо unique_ptr відсутній у стандарті, то чи потрібно мені замість цього використовувати shared_ptr?
Відповіді:
ОНОВЛЕННЯ: Ця відповідь була написана в 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) пропонує краще рішення. —Кінець примітки]
Поки стандарт не буде затверджений, завжди можливо, що комітет перегляне це рішення, хоча, на мою думку, це малоймовірне рішення.
У 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він був "скопійований".
Ні, це не застаріло. Це може бути, якщо C ++ 0x коли-небудь буде прийнято. І це реально завжди буде підтримано. Я не вірю, що жодна застаріла функція ніколи не випадала із реальних реалізацій C ++.
auto_ptrє частиною стандарту, але використовується значно менше. З практичної точки зору, його видалення матиме значно менший вплив.
<iostream.h>ніж коли-небудь використано C ++auto_ptr, але MS VC ++ (для одного) більше не надає.