Щоб запобігти цьому конкретному випадку, ви можете взяти вказівник (оскільки Weep(&std::vector<int>{1,2,3})це не дозволено), або ви можете взяти не-const посилання, яке також буде помилкою на тимчасовій основі.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
Вони все ще не гарантують, що значення залишається дійсним, але принаймні зупиняє найпростішу помилку, не створює копію і не потрібно numsстворювати спеціальним чином (наприклад, як std::shared_ptrабо std::weak_ptrтак).
std::scoped_lockприклад посилання на mutex був би прикладом, і той, де унікальний / спільний / слабкий ptr не дуже потрібен. Часто std::mutexзаповіт буде просто основним членом або локальною змінною. Ви все ще повинні бути дуже обережними, але в цих випадках загалом легко визначити тривалість життя.
std::weak_ptrє ще одним варіантом невлаштування, але тоді ви змушуєте абонента використовувати shared_ptr(і, таким чином, також купувати), а іноді цього не потрібно.
Якщо з копією все в порядку, це просто уникає проблеми.
Якщо Woopслід взяти право власності, або передайте як r-значення та перемістіть (і уникайте проблем з покажчиком / посиланням повністю), або використовуйте, unique_ptrякщо ви не можете перемістити саме значення або хочете, щоб покажчик залишався дійсним.
// 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;
Або якщо право власності розділено, ви можете використовувати shared_ptrдля всього, і це буде видалено разом із остаточним посиланням, але це може зробити відстеження життєвих циклів об'єкта дуже заплутаним, якщо надмірно використовувати.
std::unique_ptrдля ексклюзивного володіння,std::shared_ptrабо для спільного володіння, абоstd::weak_ptr, принаймні, для визнання втрачених даних).