Merakam Penunjuk Unik dalam Ungkapan Lambda
Adalah perkara biasa untuk menghadapi kesukaran apabila cuba menangkap penunjuk unik dalam ungkapan lambda. Pertimbangkan senario berikut:
std::function<void()> getAction(std::unique_ptr<MyClass> &&psomething) { // Caller gives ownership of psomething return [psomething]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
Kod di atas gagal disusun kerana ketidakupayaan lambda untuk menangkap penunjuk unik melalui rujukan. Untuk menyelesaikan isu ini, C 14 memperkenalkan tangkapan umum lambda.
Tangkapan Umum Lambda dalam C 14
Tangkapan umum Lambda membenarkan untuk menangkap pembolehubah mengikut nilai atau pergerakan. Ini dicapai dengan menggunakan sintaks = move() apabila menangkap penunjuk unik, seperti yang dilihat di bawah:
std::function<void()> getAction(std::unique_ptr<MyClass> psomething) { // Caller gives ownership of psomething return [auto psomething = std::move(psomething)]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
Dengan menggunakan auto, lambda secara automatik menyimpulkan jenis psomething, yang merupakan penunjuk unik. Ungkapan = std::move(psomething) secara eksplisit memindahkan pemilikan penuding unik ke dalam ungkapan lambda.
Pelaksanaan Move and Copy
Pelaksanaan salinan dan pindahkan fungsi yang disediakan dalam soalan adalah sah untuk salinan/pindah dua fasa (seperti yang diterangkan dalam [StackOverflow ini soalan](https://stackoverflow.com/questions/6322951/whats-the-difference-between-a-copy-constructor-and-a-move-constructor)).
Walau bagaimanapun, ia adalah penting untuk ambil perhatian bahawa C 11 memperkenalkan makna yang berbeza untuk fungsi bergerak melalui ungkapan std::move. Ungkapan std::move rvalue-melayakkan objek yang digunakan, pada asasnya menunjukkan bahawa ia harus dialihkan. Oleh itu, dalam konteks tangkapan umum lambda, tidak perlu memanggil secara eksplisit std::move pada penunjuk unik; lambda akan mengalihkan pemilikan secara automatik mengikut keperluan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menangkap Penunjuk Unik dalam Ungkapan C Lambda dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!