Чтобы предотвратить этот конкретный случай, вы можете либо взять указатель (так как Weep(&std::vector<int>{1,2,3})это не разрешено), либо вы можете использовать неконстантную ссылку, которая также будет иметь временную ошибку.
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в качестве примера можно привести ссылку на мьютекс, а в случае, когда уникальное / общее / слабое 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, по крайней мере, для распознавания потерянных данных).