Czy auto_ptr jest przestarzałe?

83
  1. Czy auto_ptr zostanie wycofane w nadchodzącym standardzie C ++?
  2. Czy do przeniesienia własności należy użyć unique_ptr zamiast shared_ptr?
  3. Jeśli unique_ptr nie znajduje się w standardzie, czy muszę zamiast tego użyć shared_ptr?
dimba
źródło

Odpowiedzi:

80

AKTUALIZACJA: Ta odpowiedź została napisana w 2010 roku i zgodnie z oczekiwaniami std::auto_ptrzostała wycofana. Porada jest całkowicie ważna.

W C ++ 0x std::auto_ptrzostanie wycofane na korzyść std::unique_ptr. Wybór inteligentnego wskaźnika będzie zależał od przypadku użycia i wymagań, z std::unique_ptrsemantyką przenoszenia dla pojedynczej własności, która może być używana wewnątrz kontenerów (przy użyciu semantyki przenoszenia) i std::shared_ptrkiedy własność jest współdzielona.

Powinieneś spróbować użyć inteligentnego wskaźnika, który najlepiej pasuje do sytuacji, wybór odpowiedniego typu wskaźnika zapewnia innym programistom wgląd w projekt.

David Rodríguez - dribeas
źródło
22

Tak, na dzień dzisiejszy auto_ptrzostanie wycofany w C ++ 0x i powinieneś unique_ptrzamiast tego używać . Z najnowszego projektu normy (n3035), sekcja D.9

Szablon klasy auto_ptrjest przestarzały. [Uwaga: szablon zajęć unique_ptr(20.9.10) zapewnia lepsze rozwiązanie. —End note]

Dopóki standard nie zostanie ratyfikowany, zawsze istnieje możliwość, że komisja zrewiduje tę decyzję, chociaż uważam, że jest to mało prawdopodobne w przypadku tej decyzji.

R Samuel Klatchko
źródło
18

Nie tylko auto_ptrjest przestarzałe w C ++ 11 (D.10, strona 1228) , ale także będzie usunięta w przyszłej wersji C ++ :

Przyjęty N4190, a właściwie usunięte (nie tylko przestarzałe) kilka archaiczne rzeczy z biblioteki standardowej C ++, w tym auto_ptr, bind1st/ bind2nd, ptr_fun/mem_fun / mem_fun_ref, random_shufflei kilka innych. Zostały one teraz usunięte z wersji roboczej biblioteki standardowej C ++ 17 i nie będą częścią przyszłego przenośnego C ++.

Inny dokument na ten temat: Język programowania C ++, Grupa robocza Library Evolution - dokument N4190 , jeśli chcesz uzyskać więcej informacji.

Możesz przekonwertować dowolny kod za pomocą auto_ptr automatycznie, używając unique_ptrzamiast tego:

Każdy kod używający auto_ptrmoże być mechanicznie przekształcony w używany unique_ptr, z move()wstawianym zawsze, gdy auto_ptrbył „kopiowany”.

Maxime Lorant
źródło
3

Nie, to nie jest przestarzałe. Może tak być, jeśli C ++ 0x zostanie kiedykolwiek zaakceptowany. I realistycznie zawsze będzie obsługiwane. Nie wierzę, że jakakolwiek przestarzała funkcja została kiedykolwiek usunięta z rzeczywistych implementacji C ++.


źródło
5
Standard C ++ został zaktualizowany tylko raz, a było to w zasadzie tylko sprostowanie techniczne (tj. Naprawione do problemów, które były cytowane). Nic dziwnego, że niczego nie usunął. OTOH, stare funkcje ostatecznie zostają usunięte z kompilatorów. Na przykład prawdopodobnie używano więcej C ++ <iostream.h>niż kiedykolwiek wcześniej auto_ptr, ale MS VC ++ (na przykład) już go nie zapewnia.
Jerry Coffin
1
@Jerry iostream.h nigdy nie był częścią żadnego standardu. I jako takie, nie jest przestarzałe.
@Neil: Nie, ale był używany dużo . auto_ptrjest częścią standardu, ale jest używany znacznie rzadziej. Z praktycznego punktu widzenia jego usunięcie będzie miało drastycznie mniejsze skutki.
Jerry Coffin
2
@Jerry, cóż, często używam auto_ptr i w ogóle nie używam iostream.h. Czasami wydaje mi się, że komitet odpowiedzialny za standard C ++ ma trochę pszczoły w swojej zbiorczej masce, jeśli chodzi o wycofanie. Niektóre rzeczy, takie jak oryginalne strumienie ciągów, były oczywiście błędne, ale innym podobał się pomysł użycia bezimiennych przestrzeni nazw zamiast doskonale nadającego się do użytku słowa kluczowego „static”, które były (i są) kompletnie szalone.
1
@Neil: Cóż, spróbujmy spojrzeć na to z perspektywy. Niezależnie od tego, co robię osobiście, weź pod uwagę, że wyszukiwanie w Google dla „<iostream.h>” daje ~ 263 000 trafień, a zrobienie tego samego co auto_ptr daje ~ 66 000 trafień.
Jerry Coffin