Rumah > pembangunan bahagian belakang > C++ > Bagaimana Saya Boleh Mencipta `std::function` daripada Lambda Move-Capturing?

Bagaimana Saya Boleh Mencipta `std::function` daripada Lambda Move-Capturing?

DDD
Lepaskan: 2024-12-24 10:12:37
asal
383 orang telah melayarinya

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

Mencipta std::function daripada Move-Capturing Lambda

Mencipta std::function daripada jenis bergerak sahaja, seperti sebagai lambda penangkap bergerak, boleh menyebabkan ralat disebabkan oleh sekatan pembangun bergerak. Sekatan ini berpunca daripada cara std::function ditakrifkan dan dibina.

Memahami std::function Constructor

std::function constructor boleh dipanggil masuk dua cara:

  1. std::function(F f);
  2. std::function(allocator_arg_t, const A& a, F f);

Dalam kedua-dua kes, lambda (F) mestilah CopyConstructible. Ini bermakna anda tidak boleh memindahkan lambda ke dalam std::fungsi secara langsung.

Selain itu, operator = ditakrifkan dari segi pembina dan swap, yang bermaksud sekatan yang sama dikenakan.

Akibat untuk Jenis Pergerakan Sahaja

Oleh itu, tidak mungkin untuk membina std::fungsi daripada lambda penangkap bergerak yang menangkap jenis bergerak sahaja. Percubaan untuk berbuat demikian akan mengakibatkan ralat masa penyusunan disebabkan oleh pembina salinan yang dipadamkan secara tersirat.

Penyelesaian Alternatif

Untuk menyelesaikan isu ini, anda boleh menggunakan shared_ptr untuk membungkus jenis bergerak sahaja dan kemudian menangkap shared_ptr dalam lambda anda. shared_ptr akan memastikan bahawa jenis boleh disalin, membolehkan anda mencipta fungsi std:: daripada lambda.

Atas ialah kandungan terperinci Bagaimana Saya Boleh Mencipta `std::function` daripada Lambda Move-Capturing?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan