Aby uniknąć tego konkretnego przypadku, możesz wybrać wskaźnik (ponieważ Weep(&std::vector<int>{1,2,3})jest to niedozwolone) lub możesz wybrać odniesienie inne niż stałe, które również będzie tymczasowo powodować błąd.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
Nadal nie gwarantują one, że wartość pozostaje ważna, ale powstrzymuje przynajmniej najłatwiejszy błąd, nie tworzy kopii i nie musi numsbyć tworzona w specjalny sposób (np. Jako std::shared_ptrlub std::weak_ptrrobi).
std::scoped_lockodwołanie się do muteksu byłoby przykładem, a taki, w którym unikalne / wspólne / słabe ptr nie jest tak naprawdę potrzebne. Często std::mutexbędzie to tylko podstawowy element członkowski lub zmienna lokalna. Nadal musisz być bardzo ostrożny, ale w takich przypadkach zazwyczaj łatwo jest określić długość życia.
std::weak_ptrjest kolejną opcją dla nie posiadających, ale wtedy zmuszasz osobę wywołującą do używania shared_ptr(a tym samym do przydzielania sterty), a czasem nie jest to pożądane.
Jeśli kopia jest w porządku, to po prostu pozwala uniknąć problemu.
Jeśli Woopnależy przejąć na własność albo przekazać jako wartość r i przenieść (i całkowicie unikać problemów ze wskaźnikiem / referencją), albo użyć, unique_ptrjeśli nie można przenieść samej wartości lub chcesz, aby wskaźnik pozostał ważny.
// the caller can't continue to use nums, they could however get `numbers` from Woop or such like
// or just let Woop only manipulate numbers directly.
Woop(std::vector<int> &&nums)
: numbers(std::move(nums)) {}
std::vector<int> numbers;
// while the caller looses the unique_ptr, they might still use a raw pointer, but be careful.
// Or again access numbers only via Woop as with the move construct above.
Woop(std::unique_ptr<std::vector<int>> &&nums)
: numbers(std::move(nums)) {}
std::unique_ptr<std::vector<int>> numbers;
Lub jeśli własność jest współdzielona, możesz użyć shared_ptrdo wszystkiego, a zostanie ona usunięta wraz z ostatecznym odniesieniem, ale może to spowodować, że śledzenie cykli życia obiektu stanie się bardzo mylące, jeśli zostanie nadmiernie wykorzystane.
std::unique_ptrdla wyłącznej własnościstd::shared_ptrlub współwłasności, lubstd::weak_ptrprzynajmniej do rozpoznania utraconych danych).