O ile mi wiadomo, podobnie jak legalność delete this
, nowe miejsce this
jest dozwolone. Ponadto, jeśli chodzi o to this
, czy lub inne wcześniej istniejące wskaźniki / odniesienia mogą być później użyte, istnieje kilka ograniczeń:
[basic.life]
Jeśli po zakończeniu okresu użytkowania obiektu i przed ponownym użyciem lub zwolnieniem pamięci zajmowanej przez obiekt zajmowany przez obiekt zostanie utworzony nowy obiekt w miejscu przechowywania, w którym zajmowany był obiekt oryginalny, wskaźnik wskazujący na obiekt oryginalny, odniesienie, które w odniesieniu do oryginalnego obiektu lub nazwa oryginalnego obiektu będzie automatycznie odnosić się do nowego obiektu, a po rozpoczęciu życia nowego obiektu można go używać do manipulowania nowym obiektem, jeśli:
- pamięć dla nowego obiektu dokładnie nakłada się na miejsce przechowywania, które zajmował oryginalny obiekt, oraz
- nowy obiekt jest tego samego typu co obiekt oryginalny (ignorując kwalifikatory cv najwyższego poziomu), oraz
- typ oryginalnego obiektu nie jest const-kwalifikowany, a jeśli typ klasy, nie zawiera żadnego niestatycznego elementu danych, którego typ jest const-kwalifikowany lub typu referencyjnego, oraz
- ani oryginalny obiekt, ani nowy obiekt nie są potencjalnie nakładającymi się podobiektami ([intro.object]).
Pierwsze dwa są spełnione w tym przykładzie, ale dwa ostatnie będą musiały zostać wzięte pod uwagę.
W odniesieniu do trzeciego punktu, biorąc pod uwagę, że funkcja nie jest zakwalifikowana do const, należy całkiem bezpiecznie założyć, że oryginalny obiekt nie jest const. Błąd jest po stronie wywołującej, jeśli constness został odrzucony. Jeśli chodzi o członka const / referencyjnego, myślę, że można to sprawdzić, stwierdzając, że można to przypisać:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
Oczywiście, ponieważ możliwość przypisania jest wymogiem, możesz po prostu użyć tego, *this = {};
którego spodziewałbym się stworzyć ten sam program. Być może bardziej interesującym przypadkiem może być ponowne użycie pamięci *this
dla obiektu innego typu (co nie spełniłoby wymagań dotyczących używania this
, przynajmniej bez ponownej interpretacji + prania).
Podobnie jak w przypadku delete this
nowego miejsca docelowego z this
trudem można je opisać jako „bezpieczne”.