- Czy auto_ptr zostanie wycofane w nadchodzącym standardzie C ++?
- Czy do przeniesienia własności należy użyć unique_ptr zamiast shared_ptr?
- Jeśli unique_ptr nie znajduje się w standardzie, czy muszę zamiast tego użyć shared_ptr?
Odpowiedzi:
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.
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.
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żywanyunique_ptr, zmove()wstawianym zawsze, gdyauto_ptrbył „kopiowany”.
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 ++.
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.
<iostream.h>niż kiedykolwiek wcześniejauto_ptr, ale MS VC ++ (na przykład) już go nie zapewnia.