Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya Boleh Mengembalikan `std::unique_ptr` Tanpa Menggunakan `std::move`?

Bagaimanakah saya Boleh Mengembalikan `std::unique_ptr` Tanpa Menggunakan `std::move`?

Mary-Kate Olsen
Lepaskan: 2024-12-22 05:01:09
asal
1006 orang telah melayarinya

How Can I Return a `std::unique_ptr` Without Using `std::move`?

Returning std::unique_ptr without std::move: How Is It Possible?

Walaupun larangan pembinaan salinan dalam std:: unique_ptr, adalah mungkin untuk mengembalikan a std::unique_ptr daripada fungsi tanpa menggunakan std::move. Percanggahan jelas ini berakar umbi dalam pengecualian khusus yang dibenarkan oleh spesifikasi bahasa C.

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;
}
Salin selepas log masuk

Dalam baris 1, unique_ptr dianggap sebagai rnilai semasa resolusi beban lampau. Memandangkan pembina bergerak tersedia, ia dipilih. Walau bagaimanapun, nilai pulangan sebenar ialah objek automatik tidak meruap p, bukan nilai yang dialihkan. Pengkompil menghapuskan pembinaan salinan/pindah, membenarkan pengembalian unik_ptr tanpa menggunakan std::move secara eksplisit.

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!

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