Rumah > pembangunan bahagian belakang > C++ > Bolehkah saya Mengembalikan `std::unique_ptr` Tanpa `std::move` dalam C ?

Bolehkah saya Mengembalikan `std::unique_ptr` Tanpa `std::move` dalam C ?

Susan Sarandon
Lepaskan: 2024-12-15 02:42:09
asal
463 orang telah melayarinya

Can I Return a `std::unique_ptr` Without `std::move` in C  ?

Mengembalikan std::unique_ptr tanpa std::move

Dalam C , std::unique_ptr menguatkuasakan semantik pergerakan untuk menghalang pemilikan berbilang objek. Walau bagaimanapun, adalah mungkin untuk mengembalikan unique_ptr daripada fungsi tanpa menggunakan std::move. Tingkah laku ini boleh dikaitkan dengan ciri bahasa yang dipanggil penyingkiran salinan.

Penyingkiran Salin

Menurut spesifikasi bahasa C (12.8 §34 dan §35), pelaksanaan dibenarkan untuk diketepikan (tinggalkan ) menyalin/memindahkan operasi apabila kriteria tertentu dipenuhi. Khususnya, penyingkiran salinan dibenarkan dalam penyata pemulangan untuk jenis pemulangan kelas, dengan syarat ungkapan itu ialah nama objek automatik tidak meruap dengan jenis cv-tidak layak yang sama dengan jenis pemulangan fungsi.

Elision dalam unique_ptr Return Statements

Dalam kod contoh yang anda berikan:

unique_ptr<int> foo()
{
  unique_ptr<int> p(new int(10));
  return p;  // Line 1
}
Salin selepas log masuk

p ialah objek automatik tidak meruap yang mempunyai jenis yang sama dengan jenis pemulangan fungsi, unique_ptr. Oleh itu, pengkompil dibenarkan untuk mengenepikan pembinaan salinan p.

Apabila pengkompil menemui baris 1, ia mula-mula melakukan resolusi beban lampau untuk memilih pembina untuk operasi penyalinan, seolah-olah p telah ditetapkan oleh nilai r. Walau bagaimanapun, memandangkan kriteria untuk penyingkiran dipenuhi, pembinaan salinan ditiadakan dan nilai yang dikembalikan menjadi unik_ptr yang dipindahkan.

Implikasi untuk amalan terbaik

Adalah penting untuk ambil perhatian bahawa pemulangan mengikut nilai harus menjadi pilihan lalai dalam senario ini. Dengan adanya penyingkiran salinan, nilai yang dinamakan dalam penyata pulangan dianggap sebagai nilai r. Ini bermakna walaupun tanpa menggunakan std::move secara eksplisit, unique_ptr yang dikembalikan boleh dialihkan daripada objek sementara fungsi.

Membalikan melalui rujukan atau menggunakan std::make_unique adalah kedua-dua alternatif yang berdaya maju untuk mengelakkan penyingkiran salinan dan memastikan eksplisit pemindahan hak milik.

Atas ialah kandungan terperinci Bolehkah saya Mengembalikan `std::unique_ptr` Tanpa `std::move` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan