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?
cevap
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 */ });
Bu bir rıhtımı yakalamaz. referans. Bir rvalue referans kullanılarak oluşturulan bir değeri yakalar. –
Bu teknik olarak doğru. Cevabı değiştirdim. – Jodocus
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. –
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)
};
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