Rumah >pembangunan bahagian belakang >C++ >Adakah Menangkap Rujukan melalui Rujukan dalam C 11 Lambdas Menjamin Akses kepada Nilai Yang Diubah Suai?

Adakah Menangkap Rujukan melalui Rujukan dalam C 11 Lambdas Menjamin Akses kepada Nilai Yang Diubah Suai?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-03 22:39:03453semak imbas

Does Capturing a Reference by Reference in C  11 Lambdas Guarantee Access to the Modified Value?

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&amp; x) {
    return [&amp;]{ 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:

  • "Skop" dalam C merujuk kepada kawasan kod statik dan leksikal yang mana carian nama tidak layak mengaitkan nama dengan pengisytiharan. Ia tidak mempunyai kaitan langsung dengan seumur hidup.
  • Peraturan "Skop jangkauan" untuk lambda menentukan masa penangkapan dibenarkan berdasarkan peraturan sintaksis, bukan seumur hidup.

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!

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