Rumah >pembangunan bahagian belakang >C++ >Bolehkah saya Mencipta `std::function` daripada Ungkapan Lambda yang Menangkap Bergerak?

Bolehkah saya Mencipta `std::function` daripada Ungkapan Lambda yang Menangkap Bergerak?

Barbara Streisand
Barbara Streisandasal
2024-12-11 13:46:11976semak imbas

Can I Create an `std::function` from a Move-Capturing Lambda Expression?

Mencipta std::fungsi daripada Ungkapan Lambda 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:

  • Tangkapan ekspresi lambda mestilah boleh disalin.
  • Ungkapan lambda mestilah Boleh Dipanggil dengan jenis hujah yang ditentukan dan jenis kembali.
  • Pembina dan pemusnah salinan tangkapan lambda tidak boleh membuang pengecualian.

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!

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