Per evitare quel caso particolare, puoi scegliere di prendere un puntatore (poiché Weep(&std::vector<int>{1,2,3})non è consentito) o potresti prendere un riferimento non const che si guasterà anche in un temporaneo.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
Questi ancora non garantiscono che il valore rimanga valido, ma almeno interrompe l'errore più semplice, non crea una copia e non deve numsessere creato in un modo speciale (ad esempio come std::shared_ptro std::weak_ptrfa).
std::scoped_lockprendere un riferimento al mutex sarebbe un esempio, e uno in cui un ptr unico / condiviso / debole non è realmente desiderato. Spesso std::mutexsarà solo un membro di base o una variabile locale. Devi ancora stare molto attento, ma in questi casi è generalmente facile determinare la durata della vita.
std::weak_ptrè un'altra opzione per non possedere, ma poi costringi il chiamante a usare shared_ptr(e quindi anche a allocare l'heap), e talvolta ciò non è voluto.
Se una copia è OK, questo evita il problema.
Se Woopdeve diventare proprietario, passa come valore r e sposta (ed evita del tutto i problemi relativi a puntatore / riferimento), oppure usa unique_ptrse non puoi spostare il valore stesso o vuoi che il puntatore rimanga valido.
// 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;
Oppure, se la proprietà è condivisa, puoi utilizzarla shared_ptrper tutto e verrà eliminata insieme al riferimento finale, ma ciò può rendere molto confuso il monitoraggio dei cicli di vita degli oggetti se utilizzato in modo eccessivo.
std::unique_ptrper proprietà esclusivastd::shared_ptro proprietà condivisa, ostd::weak_ptralmeno per riconoscere i dati persi).