Choć rozumiem, dlaczego nie ma operator==
dla shared_ptr
i unique_ptr
, zastanawiam się, dlaczego nie ma nikogo na shared_ptr
i weak_ptr
. Zwłaszcza, że można utworzyć weak_ptr
za pośrednictwem odnośnika na shared_ptr
. Założę się, że przez 99% czasu chcesz lhs.get() == rhs.get()
. Chciałbym teraz iść dalej i wprowadzić to do mojego kodu, chyba że ktoś może wskazać mi dobry powód, dlaczego nie powinienem robić czegoś takiego.Missing równość shared_ptr i weak_ptr
Odpowiedz
weak_ptr
nie ma metody get()
, ponieważ trzeba jawnie zablokować weak_ptr
, zanim będzie można uzyskać dostęp do podstawowego wskaźnika. Podkreślenie tego jest świadomą decyzją projektową. Jeśli konwersja była niejawna, bardzo łatwo byłoby napisać kod, który byłby niebezpieczny, gdyby ostatni obiekt shared_ptr
do obiektu miał zostać zniszczony, podczas gdy podstawowa wskazówka uzyskana z weak_ptr
była wciąż badana.
This boost page ma dobry opis pułapek i dlaczego weak_ptr
ma tak ograniczony interfejs.
Jeśli chcesz wykonać szybkie porównanie, możesz wykonać shared == weak.lock()
. Jeśli porównanie jest prawdziwe, to wiesz, że weak
musi być nadal ważny, ponieważ przechowujesz oddzielny shared_ptr
dla tego samego obiektu. Nie ma takiej gwarancji, jeśli porównanie zwróci wartość false.
Wywołanie 'blokady' dla większej części kodu naprawdę ma więcej sensu. Dobra decyzja dotycząca projektu. – abergmeier
Ponieważ ma to koszt.
A weak_ptr
jest jak obserwator, a nie prawdziwy wskaźnik. Aby wykonać z nim jakąkolwiek pracę, najpierw musisz uzyskać od niej numer shared_ptr
, używając metody lock()
.
To skutkuje nabyciem prawa własności, ale jest tak kosztowne, jak kopiowanie zwykłego shared_ptr
(przyrost zliczania, itp.), Więc nie jest to nic trywialnego.
Jako taka, nie podając ==
, jesteś zmuszony do cofnięcia się i faktycznie sprawdzić, czy naprawdę tego potrzebujesz, czy nie.
Nie jestem pewien, czy porównywanie potrzeb równości wymaga dbałości o ważność i jako takie mogłoby być realizowane tanio: albo "słabe_ptr" odnosi się do tego samego bytu, w którym to przypadku musi być ważne (albo 0), albo odnosi się do inny podmiot, w którym to przypadku nie obchodzi nas, czy jest ono ważne. –
@KonradRudolph: może, może nie. Ale ponieważ uzyskanie wskaźnika byłoby ogólnie niebezpieczne (ponieważ miałbyś wskaźnik, ale nie byłbyś w stanie uzyskać dostępu do pointee), nie możesz uzyskać wskaźnika z 'weak_ptr' i jesteś zmuszony przejść przez' shared_ptr'. Więc ... –
Nie, uzyskanie wskaźnika jest bezpieczne, o ile jest to zrobione * wewnętrznie *. –
Ale 'weak_ptr' nie ma metody" get ". –
Derp. Błędnie przeczytałem pytanie. –