Pour éviter ce cas particulier, vous pouvez choisir de prendre un pointeur (car ce Weep(&std::vector<int>{1,2,3})n'est pas autorisé) ou vous pouvez prendre une référence non const qui provoquera également une erreur sur un temporaire.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
Celles-ci ne garantissent toujours pas que la valeur reste valide, mais empêche au moins l'erreur la plus simple, ne crée pas de copie et n'a pas besoin d' numsêtre créée d'une manière spéciale (par exemple, comme std::shared_ptrou le std::weak_ptrfait).
std::scoped_lockprendre une référence au mutex serait un exemple, et celui où un ptr unique / partagé / faible n'est pas vraiment souhaité. Souvent, le std::mutexsera simplement un membre de base ou une variable locale. Vous devez toujours être très prudent, mais dans ces cas, il est généralement facile de déterminer la durée de vie.
std::weak_ptrest une autre option pour les non-propriétaires, mais vous forcez ensuite l'appelant à utiliser shared_ptr(et donc également à allouer des tas), et parfois ce n'est pas souhaité.
Si une copie est OK, cela évite simplement le problème.
Si Woopdoit s'approprier, passez comme valeur r et déplacez (et évitez complètement les problèmes de pointeur / référence), ou utilisez unique_ptrsi vous ne pouvez pas déplacer la valeur elle-même ou si le pointeur reste valide.
// 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;
Ou si la propriété est partagée, vous pouvez l'utiliser shared_ptrpour tout, et elle sera supprimée avec la référence finale, mais cela peut rendre la surveillance des cycles de vie des objets très déroutante si elle est sur-utilisée.
std::unique_ptrpour la propriété exclusive, soit pour la propriétéstd::shared_ptrpartagée, soitstd::weak_ptr, au moins, pour reconnaître les données perdues).