Adakah Menangkap Rujukan melalui Rujukan dalam C 11 Lambdas Dijamin Menghasilkan Nilai Yang Dikemas Kini?

Patricia Arquette
Lepaskan: 2024-11-04 20:50:02
asal
328 orang telah melayarinya

Is Capturing a Reference by Reference in C  11 Lambdas Guaranteed to Output the Updated Value?

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

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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!