Dalam alam C , tugas untuk membina std::function daripada ungkapan lambda yang menangkap bergerak sering timbul. Walaupun ekspresi lambda yang menangkap bergerak sendiri boleh dibuat dengan lancar, enigma terletak pada ketidakupayaan untuk merangkumnya dalam fungsi std::.
Seperti yang ditunjukkan oleh contoh kami:
auto pi = std::make_unique<int>(0); auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; };
Contoh ini dengan mudah membina ungkapan lambda yang menangkap pergerakan tanpa menghadapi sebarang halangan. Walau bagaimanapun, apabila cuba untuk menerima lambda ini dalam std::function, kami menghadapi pelbagai ralat:
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);
Menyelidiki selok-belok kelas std::function, kami menemui pembina berikut:
template<class F> function(F f);
Pembina ini mendedahkan isu asas: ia memerlukan fungsi terkapsul F boleh dibina salinan. Walau bagaimanapun, ungkapan lambda penangkap bergerak kami tidak memenuhi kriteria ini; sebaliknya, ia bergerak-menangkap objek yang tidak boleh disalin.
Oleh itu, kami menyimpulkan bahawa semasa membina std::fungsi daripada ungkapan lambda yang menangkap bergerak boleh dilaksanakan, ia menghadapi halangan yang tidak dapat diatasi apabila lambda bergerak-menangkap objek yang tidak boleh disalin. Dalam senario sedemikian, pendekatan alternatif, seperti simpulan bahasa "lepaskan/peroleh-dalam-lambda", menjadi perlu.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mencipta `std::function` daripada Lambda Menangkap Bergerak dengan Objek Tidak Boleh Disalin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!