2017-09-21 39 views
9

Sadece b ile b arasındaki farkın "vec" için "v" takma adı oluşturması veya bunda daha fazlası olması doğru mu?Lambdalarda [ve ele geçirilen] ve [& local = yakalanan] tarafından yakalama arasında ne gibi farklar vardır?

+0

http://en.cppreference.com/w/cpp/language/lambda#Lambda_capture: değeriyle yakalamak için olsaydı Ancak, bir fark var olacaktır) ancak ilgili snippet * "Bir başlatıcı ile bir yakalama, deklanşör bölgesi lambda ifadesinin gövdesi olan tip auto ile bildirilen bir değişkeni bildirip açık bir şekilde yakalarmış gibi davranır." * – CoryKramer

cevap

5

Temel olarak yok. Yakalanan değere özel bir ad vermenize izin vermek için sadece orada.

Not ancak bu sözdizimi (denilen init yakalama) aslında kapatılması içine bir nesneyi taşımak istediğinizde gerekli olduğunu:

std::vector<int> vector; 
auto lambda = [vec = std::move(vector)]() { /* the lambda owns the vector now */ }); 
+5

Bu bir rıhtımı yakalamaz. referans. Bir rvalue referans kullanılarak oluşturulan bir değeri yakalar. –

+0

Bu teknik olarak doğru. Cevabı değiştirdim. – Jodocus

+1

Bunun daha iyi olduğundan emin değilim. "Referans ile yakalama", "[& vec_ref = vec_orig]" anlamına gelir; bu nedenle, insanlar, rıhtımlı bir referans olan bir lambda yakalama değişkeni oluşturmak için "rvalue referansla yakalama" beklerdi, ama yine de, gerçekten yarattığınız şey bir değerdir . Sadece RHS'yi rücu bir referansa çevirerek hareket ettiricisini kullanacak. –

11

Bu durumda gerçek bir fark yoktur. [Buradan] Bu konuda daha fazla bilgi (Orada

const std::vector<int> vec; // note const 

auto foo = [vec]() mutable { 
    // can't change vec here since it is captured with cv-qualifiers 
}; 

auto bar = [v = vec]() mutable { 
    // can change v here since it is captured by auto deduction rules 
    // (cv-qualifiers dropped) 
};