Menangkap Rujukan melalui Rujukan dalam C 11 Lambdas
Coretan kod ini menunjukkan penangkapan rujukan integer melalui rujukan dalam ungkapan lambda:
<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>
Adakah kod ini dijamin untuk mengeluarkan 5 tanpa menggunakan gelagat yang tidak ditentukan?
Kod ini sememangnya dijamin berfungsi tanpa menggunakan gelagat yang tidak ditentukan. Bertentangan dengan menangkap mengikut nilai ([= x]), menangkap melalui rujukan ([&x]) memanfaatkan pengecualian unik dalam standard C yang membolehkan rujukan berterusan di luar jangka hayatnya. Ini kerana rujukan yang ditangkap oleh ungkapan lambda dilaksanakan sebagai akses ahli kepada jenis penutupan lambda.
Skop dan Pertimbangan Sepanjang Hayat
Adalah penting untuk ambil perhatian bahawa peraturan skop capaian kerana lambda adalah sintaksis semata-mata dan tidak memainkan peranan dalam senario ini. Entiti yang dirujuk, x, berada dalam skop capaian lambda dan boleh ditangkap.
Perkataan Standard
Menurut [expr.prim.lambda]/17 daripada standard C, hanya ungkapan yang ditangkap melalui salinan yang mengalami transformasi menjadi akses ahli pada jenis penutupan lambda. Ungkapan yang ditangkap melalui rujukan dibiarkan begitu sahaja tanpa diubah suai dan terus menandakan entiti asal.
Selain itu, piawaian itu tidak secara jelas menangani isu rujukan yang digunakan di luar jangka hayatnya. Walau bagaimanapun, memandangkan tiada penalti untuk menggunakan rujukan di luar jangka hayatnya (melainkan dirujuk daripada pemulanya sendiri atau ahli kelas sebelumnya), kod ini dibenarkan untuk berfungsi seperti yang dimaksudkan.
Kesimpulan
Menangkap rujukan melalui rujukan dalam lambda C 11 dijamin berfungsi seperti yang diharapkan, mengeluarkan nilai kemas kini integer yang dirujuk tanpa menggunakan gelagat yang tidak ditentukan. Ini adalah berdasarkan takrifan standard bagi tangkapan lambda dan kekurangan penalti yang ditetapkan kerana menggunakan rujukan di luar jangka hayatnya dalam konteks tertentu tertentu.
Atas ialah kandungan terperinci Adakah Menangkap Rujukan melalui Rujukan dalam C 11 Lambdas Dijamin Menghasilkan Nilai Yang Dikemas Kini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!