Wraz z nadejściem nowego standardu (i części już dostępnych w niektórych kompilatorach) nowy typ std::unique_ptr
ma być zamiennikiem std::auto_ptr
.
Czy ich użycie dokładnie się pokrywa (więc mogę dokonać globalnego wyszukiwania / zamiany w moim kodzie (nie żebym to zrobił, ale gdybym to zrobił)), czy powinienem być świadomy pewnych różnic, które nie są oczywiste po przeczytaniu dokumentacji?
Również jeśli jest to bezpośredni zamiennik, dlaczego nadać mu nową nazwę, a nie tylko poprawić std::auto_ptr
?
źródło
std::auto_ptr
istd::unique_ptr
w niektórych przypadkach są niekompatybilne, aw innych spadek. Zatem żadne wyszukiwanie / zamiana nie jest wystarczająco dobre. Jednak po znalezieniu / zamianie podczas pracy z błędami kompilacji należy naprawić wszystko oprócz dziwnych przypadków narożnych. Większość błędów kompilacji będzie wymagać dodaniastd::move
.100% kompatybilna, o ile nie przekazujesz jej wartości do innej funkcji.
niezgodny w 100%, ale zgodny w 99% nie wydaje się błędny.
100% zgodny z jednym zastrzeżeniem,
unique_ptr
s musi zostać przekazany przezstd::move
wywołanie. Ten jest prosty, ponieważ kompilator narzeka, jeśli nie zrobisz tego dobrze.100% kompatybilny.
ta jest trudna.
std::auto_ptr
semantyka kopiowania jest zła. Jeśli klasa nie zezwala na kopiowanie,std::unique_ptr
oznacza to spadek w zastępstwie. Jeśli jednak spróbujesz nadać klasie rozsądną semantykę kopiowania, musisz zmienićstd::auto_ptr
kod obsługi. Jest to proste, ponieważ kompilator narzeka, jeśli nie zrobisz tego dobrze. Jeśli zezwoliłeś na kopiowanie zajęć zstd::auto_ptr
członkiem bez specjalnego kodu, wstydź się i powodzenia.Podsumowując,
std::unique_ptr
jest nieprzerwanystd::auto_ptr
. Nie zezwala w czasie kompilacji zachowań, które często były błędne podczas korzystania zstd::auto_ptr
. Więc jeśli używałeś gostd::auto_ptr
z należytą starannością, przejście nastd::unique_ptr
powinno być proste. Jeśli polegałeś nastd::auto_ptr
dziwnym zachowaniu, musisz zrefakturować swój kod.źródło
AFAIK,
unique_ptr
nie jest bezpośrednim zamiennikiem. Główną wadą, którą naprawia, jest ukryte przeniesienie własności.Z drugiej strony
unique_ptr
będą miały zupełnie nowe możliwości: można je przechowywać w pojemnikach.źródło
auto_ptr
nie są dozwolone.Herb Sutter ma ładne wyjaśnienie na temat GotW # 89 :
Innymi słowy, podczas gdy globalne wyszukiwanie i zamiana może tymczasowo „zepsuć” Twój kod, powinieneś to zrobić i tak: Naprawienie błędów kompilacji może zająć trochę czasu, ale na dłuższą metę zaoszczędzi ci dużo więcej problemów.
źródło