[=] C ++ 'da ne anlama geliyor?


95

Ben bilmek istiyorum [=]nedir? İşte kısa bir örnek

template <typename T>
std::function<T (T)> makeConverter(T factor, T offset) {
    return [=] (T input) -> T { return (offset + input) * factor; };
}

auto milesToKm = makeConverter(1.60936, 0.0);

Kod []yerine nasıl çalışır [=]?

Farzediyorum

std::function<T (T)>

(T)bağımsız değişken olarak alınan ve dönüş türü bir işlev prototipi anlamına gelir T?


4
Bu, araştırılmamış 3 farklı soru soran ve C ++ 11'de lambda ifadesi nedir?
underscore_d

@Underscore_d'ye katılıyorum - Görünüşe göre bir tıklama derecelendirme artırıyor, değil mi? :)
BitTickler

Yanıtlar:


108

[=]Senin bahsettiğin parçasıdır yakalama listesinde lambda ifadesi için. Bu, C ++ 'ya lambda ifadesinin içindeki kodun başlatıldığını ve böylece lambda'nın oluşturulduğunda kullandığı tüm yerel değişkenlerin bir kopyasını alacağını söyler. Lambda ifade başvurmak mümkün olması için, bu gereklidir factorve offsetişlevi içinde lokal değişkenler olan,.

Eğer değiştirirseniz [=]ile []lambda ifadesi içindeki kod değişkenler bilmiyor çünkü, bir derleyici hatası alırsınız offsetve factorbakın. Bunu yaparsanız birçok derleyici iyi tanılama hata mesajları verir, bu yüzden deneyin ve ne olacağını görün!


13
"Bu gereklidir" - bu tam seçenek gerekli değildir; biz de yazabilirdik [&], [=offset, =input]vb.
MM

1
@MM - Bu, yerellere yapılan referansları yakalamıyor mu?
Yararsız

5
@MM Burada bir referans yakalama kullanmak bir sorun olur çünkü bu yerel değişkenlerin yaşam süreleri lambda döndürülür döndürülmez sona erecektir. Yine de, tek tek değişkenleri ayrı ayrı listeleyebileceğimiz konusunda haklısınız.
templatetypedef

47

Bu bir lambda yakalama listesi. Değişkenleri lambda için kullanılabilir hale getirir. Kullanabilirsiniz [=]değeri olan kopya, ya da [&]referans ile bu geçer.


3
Ayrıca []herhangi bir şeyi yakalamayanları da kullanabilirsiniz . :)
Daniel Kamil Kozar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.