Rumah >pembangunan bahagian belakang >C++ >Adakah Menangkap Rujukan melalui Rujukan dalam C 11 Lambdas Menjamin Akses kepada Nilai Yang Diubah Suai?
Menangkap Rujukan melalui Rujukan dalam C 11 Lambdas
Persoalannya:
Pertimbangkan coretan kod berikut:
<code class="cpp">#include <functional> #include <iostream> std::function<void()> make_function(int& x) { return [&]{ std::cout << x << std::endl; }; } int main() { int i = 3; auto f = make_function(i); i = 5; f(); }</code>
Bolehkah kami menjamin bahawa program ini akan mengeluarkan 5 tanpa menghadapi gelagat yang tidak ditentukan? Soalan ini timbul secara khusus apabila menangkap pembolehubah x melalui rujukan ([&]), dan bimbang sama ada menangkap rujukan kepada pembolehubah akan menghasilkan rujukan berjuntai sebaik sahaja fungsi make_function kembali.
Jawapannya :
Ya, kod tersebut dijamin berfungsi.
Penjelasan:
Spesifikasi C 11 lambda menyatakan bahawa rujukan yang ditangkap di sini kekal sah selagi objek yang dirujuk asal masih wujud. Ini bermakna walaupun parameter x dalam make_function keluar dari skop selepas fungsi kembali, penutupan lambda masih mengekalkan rujukan yang sah kepada integer i.
Penjelasan:
Untuk menangani beberapa ketidaktepatan dalam respons sebelumnya:
Dalam kes khusus ini, pembolehubah x berada dalam skop capaian lambda dan ditangkap melalui rujukan. Oleh itu, rujukan kekal sah dan lambda boleh terus mengakses nilai yang diubah suai bagi i.
Kesimpulan:
Kod ini menunjukkan tangkapan rujukan yang betul oleh rujukan dalam lambda. Ia dijamin menghasilkan 5 tanpa menggunakan gelagat yang tidak ditentukan.
Atas ialah kandungan terperinci Adakah Menangkap Rujukan melalui Rujukan dalam C 11 Lambdas Menjamin Akses kepada Nilai Yang Diubah Suai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!