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.
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.
Dalam kod contoh yang anda berikan:
unique_ptr<int> foo() { unique_ptr<int> p(new int(10)); return p; // Line 1 }
p ialah objek automatik tidak meruap yang mempunyai jenis yang sama dengan jenis pemulangan fungsi, unique_ptr
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.
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!