- 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_ptr
została wycofana. Porada jest całkowicie ważna.
W C ++ 0x std::auto_ptr
zostanie wycofane na korzyść std::unique_ptr
. Wybór inteligentnego wskaźnika będzie zależał od przypadku użycia i wymagań, z std::unique_ptr
semantyką 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_ptr
kiedy 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_ptr
zostanie wycofany w C ++ 0x i powinieneś unique_ptr
zamiast tego używać . Z najnowszego projektu normy (n3035), sekcja D.9
Szablon klasy
auto_ptr
jest 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_ptr
jest 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_shuffle
i 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_ptr
zamiast tego:
Każdy kod używający
auto_ptr
może być mechanicznie przekształcony w używanyunique_ptr
, zmove()
wstawianym zawsze, gdyauto_ptr
był „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_ptr
jest 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.