2014-08-28 22 views
5

Bir lambda işlevini yakalayarak yakalamayı deniyorum [&]. Yakalanan bir lambda saklayan değişken için doğru beyan nedir? [aşağıdaki f2]C++ 11 Lambda Capture ile Geçiş

// Non-capturing 
void (*f1)() = [](){ }; // Works 

// All by reference 
void (*f2)() = [&](){ }; // Syntax Error 
+5

otomatik f = [&]() {...}? – Kiroxas

+6

Yakalamalı lamelleri, işlev işaretçilerine dönüştürülemez. – user657267

+1

Referans ile bir lambda işlevini iletmeye çalışmıyorsunuz. – juanchopanza

cevap

10

, C++ standart bölüm § 5.1.2/6: [expr.prim.lambda]

olmayan bir jenerik lambda ifade için kapalı tip hiçbir lambda-yakalama ile, ortak bir sanal olmayan açık-olmayan const dönüşüm fonksiyonu, işaretçi işlevi ile aynı parametre ve geri dönüş tipini kapatma türünün işlev çağrısı operatörü olan C++ dil bağlantısı (7.5) ile işlevine sahiptir. Bu dönüşüm işlevi tarafından döndürülen değer bir yakalama (: [&] varsayılan bir) vardır, çağrıldığında, sizin lambda yana kapatma türünün işlev çağrısı operatörü

çağırma aynı etkiye sahip bir fonksiyonun adresi olacaktır Çalıştırmak için bir işaretçiye dönüştürme operatörü yoktur.


Alternatif olarak, lambda sarmak için std::function<> kullanabilirsiniz:

#include <functional> 
#include <iostream> 

int main() 
{ 
    int i = 42; 
    std::function<void(void)> f = [&](){ std::cout << i; }; 
    f(); 
} 
+2

Teşekkürler. Kendi başıma anlayabilmem için çok endişeliydi. – RandomClown