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
Lepaskan: 2024-11-03 22:39:03
asal
490 orang telah melayarinya

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>
Salin selepas log masuk

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 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan