Rumah >pembangunan bahagian belakang >C++ >Bolehkah saya Mencipta `std::function` daripada Ungkapan Lambda yang Menangkap Bergerak?
Adalah mungkin untuk membina fungsi std::dari ungkapan lambda yang menangkap bergerak; walau bagaimanapun, sekatan tertentu dikenakan.
Pembina Templat
Fungsi std:: boleh dibina daripada lambda penangkap bergerak menggunakan templat berikut pembina:
template<class F> function(F f);
Keperluan
Untuk pembina ini berfungsi, keperluan berikut mesti dipenuhi:
Jenis Alih Sahaja
Ia adalah tidak mungkin untuk membina std::fungsi daripada lambda yang bergerak-menangkap jenis bergerak sahaja. Ini kerana pembina salinan std::function dan pengendali tugasan ditakrifkan dari segi pembina yang memerlukan jenis boleh bina salinan.
Contoh
Pertimbangkan coretan kod berikut :
auto pi = std::make_unique<int>(0); // Move-capturing lambda auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; };
Percubaan untuk mencipta fungsi std:: dari lambda ini menggunakan mana-mana pendekatan berikut akan mengakibatkan ralat kompilasi:
std::function<void()> bar = foo; std::function<void()> bar{foo}; std::function<void()> bar{std::move(foo)}; std::function<void()> bar = std::move(foo); std::function<void()> bar{std::forward<std::function<void()>>(foo)}; std::function<void()> bar = std::forward<std::function<void()>>(foo);
Ini kerana pi ialah jenis bergerak sahaja dan pembina salinan std::function memerlukan jenis boleh bina salinan.
Oleh itu, jika anda ingin menggunakan lambda penangkap bergerak dengan fungsi std::, pastikan tangkapannya boleh dibina salinan.
Atas ialah kandungan terperinci Bolehkah saya Mencipta `std::function` daripada Ungkapan Lambda yang Menangkap Bergerak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!