Lambda Capture by Value Sentiasa Malar dalam C 0x?
Isu ini timbul apabila cuba menangkap nilai melalui rujukan tetapi mengubah suai kandungannya dalam ungkapan lambda. Pengkompil menganggap nilai yang ditangkap sebagai pemalar secara lalai, memastikan ia kekal tidak berubah. Walau bagaimanapun, sesetengah senario mungkin memerlukan akses bukan const kepada nilai yang ditangkap.
Memahami Tangkapan Mengikut Nilai:
Dalam C 0x, fungsi lambda boleh menangkap pembolehubah mengikut nilai atau rujukan. Apabila menangkap mengikut nilai, salinan pembolehubah dibuat dalam skop lambda, membenarkan pengubahsuaian dalam lambda. Walau bagaimanapun, secara lalai, salinan yang ditangkap dianggap sebagai tetap, menghalang pengubahsuaiannya.
Kata Kunci Boleh Berubah untuk Penyelamat:
Untuk mengatasi had ini, kata kunci boleh ubah boleh digunakan. Dengan mendahului boleh ubah pada senarai parameter lambda, kami mengisytiharkan nilai yang ditangkap secara eksplisit sebagai boleh diubah suai dalam skop lambda. Ini membolehkan akses bukan const kepada nilai yang ditangkap, menyelesaikan isu yang diterangkan dalam coretan kod yang disediakan.
Contoh:
Pertimbangkan kod berikut yang cuba menangkap nilai melalui rujukan dan memanggil bukan const kaedah:
struct foo
{
operator bool () ( const bool & a )
{
return a;
}
};
int main()
{
foo afoo;
bar auto = [=] () -> bool
{ afoo(true); };
return 0;
}
Dalam kod ini, making foo::operator() const menyelesaikan isu kompilasi. Walau bagaimanapun, penggunaan boleh ubah terus dalam ungkapan lambda memberikan fleksibiliti yang lebih besar dan membolehkan akses bukan const kepada nilai yang ditangkap tanpa mengubah suai pengisytiharan asal
Atas ialah kandungan terperinci Adakah Lambda Capture mengikut Nilai Sentiasa Malar dalam C 0x?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!