Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh Mencipta `std::function` daripada Lambda Menangkap Bergerak dengan Objek Tidak Boleh Disalin?

Mengapa Saya Tidak Boleh Mencipta `std::function` daripada Lambda Menangkap Bergerak dengan Objek Tidak Boleh Disalin?

Linda Hamilton
Linda Hamiltonasal
2024-12-18 13:25:24870semak imbas

Why Can't I Create an `std::function` from a Move-Capturing Lambda with a Non-Copyable Object?

Mencipta std::function daripada Ungkapan Lambda Move-Capturing: Menyingkap Had

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!

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