Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh Mencipta `std::function` daripada Lambda Move-Capturing?

Mengapa Saya Tidak Boleh Mencipta `std::function` daripada Lambda Move-Capturing?

Susan Sarandon
Susan Sarandonasal
2024-12-17 01:22:25277semak imbas

Why Can't I Create a `std::function` from a Move-Capturing Lambda?

Mencipta std::function daripada Move-Capturing Lambda Expression

Memahami isu mencipta std::function objects daripada ekspresi lambda adalah penting . Adalah mungkin untuk mencipta ungkapan lambda dengan tangkapan bergerak, tetapi apabila cuba merangkumnya dalam fungsi std::, ralat mungkin timbul.

Contoh Ralat

Berbilang percubaan untuk tukar lambda penangkap bergerak kepada std::function secara konsisten membawa kepada ralat "Panggil ke salinan yang dipadamkan secara tersirat pembina '

Keperluan untuk Move-Capturing Lambdas

Move capture dalam ekspresi lambda menjadi perlu dalam senario di mana perkongsian pemilikan sesuatu objek tidak berdaya maju, seperti dalam perpustakaan UI tersuai. Perpustakaan ini menawarkan kaedah seperti on_mouse_down() dan push_undo_action() untuk mendaftarkan pengendali acara menggunakan std::function. Untuk memastikan pemilikan sumber yang cekap, tangkapan alih dalam ungkapan lambda lebih diutamakan berbanding simpulan bahasa "release/acquire-in-lambda" yang lebih awal dan menyusahkan.

Sekatan ke atas std::function Construction

Pembina fungsi std:: untuk menentukan secara langsung objek fungsi mempunyai perkara berikut tandatangan:

template <class F> function(F f);</p>
<p>Walau bagaimanapun, pembina lain yang berkaitan menerima pengalokasi dan rujukan kepada jenis yang menyediakan jaminan tertentu:</p>
<pre class="brush:php;toolbar:false">template <class F, class A> function(allocator_arg_t, const A& a, F f);

Jaminan ini termasuk yang berikut:

  • F mesti boleh dibina salinan
  • f mesti boleh dipanggil dengan jenis hujah yang disediakan (ArgTypes) dan jenis kembali (R)
  • Pembina salinan dan pemusnah A tidak boleh membuang pengecualian

Kebolehgunaan untuk Move-Capture

Walaupun ungkapan lambda dengan tangkapan bergerak tidak melanggar keperluan kebolehsalinan F, ia selalunya jenis tangkapan bergerak (seperti std::unique_ptr) yang tidak menyediakan pembina salinan yang diperlukan. Akibatnya, pembinaan std::fungsi daripada lambda penangkap bergerak ini menjadi tidak dapat dilaksanakan.

Kesimpulan

Adalah penting untuk ambil perhatian bahawa penukaran pindah- menangkap lambdas ke std::function tidak boleh dilakukan kerana batasan std::function constructor dalam mengendalikan jenis bergerak sahaja. Sekatan ini berpunca daripada keperluan std::function untuk mengekalkan salinan objek fungsi terkapsul.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mencipta `std::function` daripada Lambda Move-Capturing?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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