Para evitar esse caso em particular, você pode optar por usar um ponteiro (uma vez que Weep(&std::vector<int>{1,2,3})não é permitido) ou por uma referência não-const, que também causará um erro temporário.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
Isso ainda não garante que o valor permaneça válido, mas interrompe pelo menos o erro mais fácil, não cria uma cópia e não precisa numsser criado de uma maneira especial (por exemplo, como std::shared_ptrou std::weak_ptrfaz).
std::scoped_locktomar uma referência ao mutex seria um exemplo, e aquele em que o ptr exclusivo / compartilhado / fraco não é realmente desejado. Muitas vezes, ostd::mutex será apenas um membro básico ou variável local. Você ainda precisa ter muito cuidado, mas nesses casos geralmente é fácil determinar o tempo de vida.
std::weak_ptré outra opção para quem não possui, mas força o chamador a usar shared_ptr(e, portanto, também aloca a pilha), e às vezes isso não é desejado.
Se uma cópia estiver correta, isso evita o problema.
Se Woopdeve assumir a propriedade, passe como um valor r e mova (e evite problemas de ponteiro / referência inteiramente) ou use unique_ptrse você não puder mover o valor em si ou desejar que o ponteiro permaneça válido.
// 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, se a propriedade for compartilhada, você poderá usar shared_ptrpara tudo, e ela será excluída juntamente com a referência final, mas isso pode fazer com que o controle dos ciclos de vida do objeto fique muito confuso se for usado em excesso.
std::unique_ptrpara propriedade exclusivastd::shared_ptrou propriedade compartilhada oustd::weak_ptrpara, pelo menos, reconhecer dados perdidos).