Memahami Argumen Unique_ptr dalam Pembina dan Fungsi
Dalam C 11, gerakkan semantik membolehkan pengurusan sumber yang cekap melalui kelas unique_ptr. Untuk mengendalikan parameter unique_ptr dalam pembina atau fungsi dengan berkesan, adalah penting untuk memahami mekanisme hantaran parameter yang berbeza dan implikasinya.
A. Mengikut Nilai:
Base(std::unique_ptr<Base> n)
: next(std::move(n)) {}
Salin selepas log masuk
- Fungsi ini mengambil alih pemilikan unique_ptr, bermakna ia bertanggungjawab untuk menguruskan hayatnya.
- Untuk memanggil fungsi ini, seseorang mesti memindahkan pemilikan secara eksplisit menggunakan std::move:
Base newBase(std::move(nextBase));
Salin selepas log masuk
B. Dengan Rujukan Nilai-L Bukan Const:
Base(std::unique_ptr<Base>& n)
: next(std::move(n)) {}
Salin selepas log masuk
- Ini tidak memindahkan pemilikan secara eksplisit. Fungsi ini boleh mengakses unique_ptr tetapi mungkin atau mungkin tidak menuntutnya.
- Menggunakan rujukan bukan const membolehkan fungsi berpotensi mengubah suai objek yang dirujuk.
C. Mengikut Rujukan Nilai-L Const:
Base(std::unique_ptr<Base> const& n);
Salin selepas log masuk
- Pemilikan tidak boleh dipindah milik. Fungsi ini hanya boleh mengakses objek yang dirujuk tanpa mengubah suai atau menuntutnya.
D. Mengikut Rujukan R-Value:
Base(std::unique_ptr<Base>&& n)
: next(std::move(n)) {}
Salin selepas log masuk
- Serupa dengan rujukan bukan const l-value, tetapi memerlukan std::move apabila melepasi nilai-l.
- Pemindahan hak milik mungkin atau mungkin tidak berlaku berdasarkan fungsi pelaksanaan.
Cadangan:
- Untuk memindahkan pemilikan, lulus unique_ptr mengikut nilai.
- Untuk mengakses unique_ptr tanpa memindahkan pemilikan , lulus rujukan const l-value atau lulus rujukan kepada objek asas terus.
- Elakkan menghantar unique_ptr dengan rujukan r-value kerana potensi kesamaran dalam pemindahan pemilikan.
Manipulasi Unique_ptr:
- Salinan adalah dilarang; hanya pergerakan dibenarkan menggunakan std::move.
- Pergerakan berlaku secara tersirat dalam pembina melalui semantik bergerak:
std::unique_ptr<Base> newPtr(std::move(oldPtr));
Salin selepas log masuk
Atas ialah kandungan terperinci Bagaimanakah Saya Harus Meluluskan Argumen `unique_ptr` dalam Pembina dan Fungsi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!