Returning std::unique_ptr without std::move: How Is It Possible?
Walaupun larangan pembinaan salinan dalam std:: unique_ptr
Pengecualian: Penyingkiran Salin
C membenarkan penyingkiran salinan dalam keadaan tertentu, seperti yang ditakrifkan dalam 12.8 §34 dan §35. Satu kes sedemikian ialah apabila objek automatik tidak meruap dengan jenis cv-tidak layak yang sama seperti jenis pulangan fungsi dikembalikan. Dalam senario ini, pengkompil dibenarkan untuk mengenepikan proses pembinaan salinan. Penyingkiran ini digunakan pada kedua-dua salinan dan pemindahan.
Pelaksanaan Penyingkiran Salin
Apabila penyingkiran salinan digunakan dalam penyataan pemulangan, pengkompil terlebih dahulu menganggap objek sebagai nilai r, walaupun ia adalah nilai, untuk tujuan resolusi beban lampau. Akibatnya, jika pembina bergerak tersedia, ia dipilih, tetapi tiada operasi pergerakan sebenar dilakukan. Ini menghasilkan panggilan pembina langkah kosong yang bertindak sebagai pemegang tempat dan mengekalkan semantik pemilikan penuding unik.
Contoh
Kod berikut menunjukkan fenomena:
unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // Line 1, copy elision applied } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; }
Dalam baris 1, unique_ptr
Kesimpulan
Pengecualian kepada larangan pembina salinan ini dibenarkan secara khusus oleh spesifikasi bahasa C untuk memudahkan penyataan pemulangan yang cekap dan ringkas. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa penyingkiran salinan ialah pengoptimuman yang mungkin atau mungkin tidak dilakukan oleh pengkompil. Oleh itu, secara amnya disyorkan untuk menggunakan penyataan std::move secara eksplisit untuk memastikan tingkah laku yang dimaksudkan.
Atas ialah kandungan terperinci Bagaimanakah saya Boleh Mengembalikan `std::unique_ptr` Tanpa Menggunakan `std::move`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!