2011-02-09 8 views
45

Para el siguiente código:lambdas requieren capturar 'esto' para llamar a la función de miembro estático?

struct B 
{ 
    void g() 
    { 
     []() { B::f(); }(); 
    } 

    static void f(); 
}; 

g ++ 4.6 da el error:

test.cpp: In lambda function:
test.cpp:44:21: error: 'this' was not captured for this lambda function

(Curiosamente, g ++ 4.5 compila la multa de código).

¿Esto es un error en g ++ 4.6, o es realmente necesario capturar el parámetro 'this' para poder llamar a una función miembro estática? No veo por qué debería ser así, incluso califiqué la llamada con B::.

+17

Eso sería un error. –

+2

Todavía hay un error en GCC 4.7.2. Agregar 'this' como captura sigue funcionando. –

+1

Solucionado en GCC 4.8. – akim

Respuesta

32

Estoy de acuerdo, debería compilar muy bien. Para la solución (si aún no lo sabía), simplemente agregue la captura de referencia y compilará bien en gcc 4.6

struct B 
{ 
    void g() 
    { 
     [&]() { B::f(); }(); 
    } 

    static void f() { std::cout << "Hello World" << std::endl; }; 
}; 
+27

¿Podrían haber hecho que la lambda fuera más fea? No respondas eso. Al menos los tenemos. – wheaties

+32

@wheaties Estoy decepcionado de que no puedan trabajar en '<>' de alguna manera. Solo para obtener el conjunto completo de corchetes ... – KitsuneYMG

+20

@KitsuneYMG: hay un ejemplo en http://msdn.microsoft.com/en-us/library/dd293599.aspx: auto g = [] (int x) -> función {return [=] (int y) {return x + y; }; }; – TonyK

Cuestiones relacionadas