Cara Unik_ptr Parameter Perlu Dikendalikan dalam Pembina dan Fungsi
Senario
Pertimbangkan kelas Pangkalan merujuk dirinya sebagai berikut:
class Base { public: typedef unique_ptr<Base> UPtr; Base() {} Base(Base::UPtr n) : next(std::move(n)) {} virtual ~Base() {} void setNext(Base::UPtr n) { next = std::move(n); } protected: Base::UPtr next; };
Kaedah untuk Lulus Argumen unique_ptr
Untuk menggunakan parameter unique_ptr dengan berkesan, pertimbangkan kaedah berikut:
1. Mengikut Nilai (A)
Base(std::unique_ptr<Base> n) : next(std::move(n)) {}
Apabila dipanggil sebagai Base newBase(std::move(nextBase));, kaedah ini memindahkan pemilikan penuding kepada fungsi. Selepas pembinaan, nextBase menjadi kosong.
2. Dengan Rujukan bukan nilai l (B)
Base(std::unique_ptr<Base> &n) : next(std::move(n)) {}
Ini memerlukan nilai l sebenar (pembolehubah dinamakan) dan membolehkan fungsi itu berpotensi menuntut pemilikan penunjuk.
3. Dengan const l-value Rujukan (C)
Base(std::unique_ptr<Base> const &n);
Ini menghalang fungsi daripada menyimpan penunjuk, tetapi menjamin akses kepada objek untuk tempoh pelaksanaannya.
4. Dengan Rujukan r-value (D)
Base(std::unique_ptr<Base> &&n) : next(std::move(n)) {}
Serupa dengan (B), tetapi memerlukan penggunaan std::move apabila menghantar hujah bukan sementara. Fungsi ini mungkin atau mungkin tidak menuntut pemilikan.
Pengesyoran
Memanipulasi unique_ptr
Untuk mengalihkan unique_ptr, gunakan std::move. Ini mengelakkan penyalinan dan memastikan pemindahan hak milik yang betul.
Atas ialah kandungan terperinci Bagaimanakah Parameter `unique_ptr` Dilalui dalam Pembina dan Fungsi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!