Untuk mencegah kasus tertentu, Anda dapat memilih untuk mengambil pointer (karena Weep(&std::vector<int>{1,2,3})tidak diizinkan) atau Anda dapat mengambil referensi non-const yang juga akan kesalahan sementara.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
Ini masih tidak menjamin nilainya tetap valid, tetapi paling tidak menghentikan kesalahan yang paling mudah, tidak membuat salinan, dan tidak perlu numsdibuat dengan cara khusus (misalnya seperti std::shared_ptratau std::weak_ptrtidak).
std::scoped_lockmengambil referensi ke mutex akan menjadi contoh, dan satu di mana ptr unik / bersama / lemah tidak benar-benar diinginkan. Seringkali std::mutexhanya akan menjadi anggota dasar atau variabel lokal. Anda masih harus sangat berhati-hati, tetapi dalam kasus ini umumnya mudah untuk menentukan rentang hidup.
std::weak_ptradalah pilihan lain untuk tidak memiliki, tetapi kemudian Anda memaksa pemanggil untuk menggunakan shared_ptr(dan dengan demikian juga menumpuk mengalokasikan), dan kadang-kadang itu tidak diinginkan.
Jika salinannya OK, itu hanya menghindari masalah.
Jika Woopharus mengambil kepemilikan, lewati sebagai nilai-r dan pindahkan (dan hindari sama sekali masalah penunjuk / referensi), atau gunakan unique_ptrjika Anda tidak dapat memindahkan nilainya sendiri atau ingin penunjuk tetap valid.
// 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;
Atau jika kepemilikan dibagi, Anda dapat menggunakan shared_ptruntuk semuanya, dan itu akan dihapus bersama dengan referensi terakhir, tetapi ini dapat membuat melacak siklus hidup objek menjadi sangat membingungkan jika digunakan berlebihan.
std::unique_ptruntuk kepemilikan eksklusif, ataustd::shared_ptratau kepemilikan bersama, ataustd::weak_ptr, setidaknya, mengenali data yang hilang).