2011-02-09 9 views
45

Dla następującego kodu:lambdas wymagają przechwycenia "tego", aby wywołać funkcję statycznego członka?

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

    static void f(); 
}; 

g ++ 4.6 daje błąd:

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

(ciekawe, g ++ 4.5 kompiluje kod grzywny).

Czy jest to błąd w g ++ 4.6, czy też naprawdę konieczne jest uchwycenie "tego" parametru, aby móc wywołać funkcję statycznego członka? Nie rozumiem, dlaczego tak powinno być, zakwalifikowałem nawet połączenie pod numerem B::.

+17

To byłby błąd. –

+2

Nadal błąd w GCC 4.7.2. Dodanie "tego" jako przechwytywania nadal działa. –

+1

Naprawiono w GCC 4.8. – akim

Odpowiedz

32

Zgadzam się, powinien się skompilować dobrze. Aby naprawić (jeśli jeszcze tego nie wiesz), po prostu dodaj przechwytywanie referencji, a skompiluje ono poprawnie na gcc 4.6

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

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

Czy mogliby uczynić lambdę bardziej brzydką? Nie odpowiadaj na to. Przynajmniej my je mamy. – wheaties

+32

atomy Jestem rozczarowany, że nie mogą pracować w '<>' jakoś. Aby przejść do pełnego zestawu nawiasów ... – KitsuneYMG

+20

@KitsuneYMG: Istnieje przykład na stronie http://msdn.microsoft.com/en-us/library/dd293599.aspx: auto g = [] (int x) -> funkcja {return [=] (int y) {return x + y; }; }; – TonyK

Powiązane problemy