Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh Mencipta `std::function` daripada Lambda Move-Capturing?
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: Jaminan ini termasuk yang berikut: 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!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);