Lambda c 11 deÄŸiÅŸkenleri yakalamak onlar't kullanma?
[=]
Tüm yerel değişkenler bir lambda değeri tarafından yakalandı olmak istiyorum belirtmek için kullanıyorum, bu neden olurtümişlevi kopyalanan yerel değişkenler, ya da sadece tüm yerel değişkenlerbu lambda tarafından kullanılır?
Bu yüzden, örneğin, eğer:
vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int i; });
My_huge_vector lambda onu kullanmıyorum bile kopyalanır?
CEVAP
Her değişken açıkça yakalama listesinde adı yakalanır. Varsayılan yakalama sadece (a) değil açıkça yakalama listesinde adı ve (b) de değişkenler ele geçirecekkullanılırlambda ifade gövdesi. Bir değişken açıkça adlandırılmış ve lambda ifadesi içinde değişken kullanmak istemiyorsanız, o zaman değişken yakalanır. , my_huge_vector
örnek yakalanır.
Başına C 11 §5.1.2[ifade.prim.lambda] 11/:
Bir eğerlambda ifadebir ilişkili vardıryakalama-varsayılanve onunbileşik deyimDDR-kullanır
this
veya otomatik depolama süresi ile bir değişken veDDR-kullanılırvarlık açıkça yakalanan, daha sonra değilDDR-kullanılırvarlık örtülü olarak çekilecek dedi.
Lambda ifade etti ilişkili yakalama varsayılan: varsayılan değer [=]
kullanarak deÄŸiÅŸkenleri yakalamak.
Eğer bir değişken kullanılıyorsa, (terimin Bir Tanımı Kural anlamında"") kullanılan bir değişken örtülü olarak yakalanır. my_huge_vector
tüm vücutta kullanmayın beri ("") bileşik deyim lambda ifade, örtülü olarak yakalanan değildir.
§5.1.2/14 ile devam edin
Bir varlığın kopyasını tarafından yakalanır
- örtülü olarak alınmışyakalama-varsayılan
=
ya olursa- açıkça
&
içermeyen bir yakalama ile yakalandı.
my_huge_vector
örtülü olarak yakalanır ve açıkça yakalanan olmadığından, başvuru kopyalama veya esir değil.
Lambda kullanmak, Proc kullanma zamanı...
Neden't deÄŸiÅŸkenleri " olarak ila...
Deneyin bir yakalamak Throwable Ä°stisn...
Bir parti içinde değişkenleri kullanma...
Düzenli ifade bir e-posta adresi doğru...