2010-05-14 14 views
67

Gibt es eine Möglichkeit, nach Wert zu erfassen und den erfassten Wert nicht konstant zu machen? Ich habe einen Bibliotheksfunktor, den ich gerne erfassen würde & rufen Sie eine Methode auf, die nicht const ist, aber sollte.C++ 0x Lambda-Capture von Wert immer const?

Das folgende kompiliert nicht, aber macht foo :: operator() const behebt es.

struct foo 
{ 
    bool operator() (const bool & a) 
    { 
    return a; 
    } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    foo afoo; 

    auto bar = [=]() -> bool 
    { 
     afoo(true); 
    }; 

    return 0; 
} 

Antwort

104

Verwendung veränderbar.


auto bar = [=]() mutable -> bool .... 

Ohne veränderbar deklarieren Sie den Operator() des Lambda-Objekts const.

0

Es gibt einen alternativen Weg zur Verwendung veränderbar (Lösung von Crazy Eddie vorgeschlagen).

Mit [=] erfasst Ihr Block alle Objekte nach Werten. Sie können [&] verwenden, um alle Objekte mit Bezug zu erfassen:

auto bar = [&]() -> bool 

Oder Sie als Referenz nur bestimmte Objekt erfassen kann [=, & afoo]:

auto bar = [=, &afoo]() -> bool 

dazu finden Seite für Vordere Details (Erklärung Abschnitt): http://en.cppreference.com/w/cpp/language/lambda

+7

Das macht ganz andere Dinge. Sie sind nicht austauschbar. Dies entspricht nicht der Frage des OP. –

+1

Das Problem dieser Lösung besteht darin, dass sie nicht für erfasste lokale Variablen funktioniert, die vor der Ausführung des Lambda zerstört wurden (zum Beispiel wenn Sie einen gelösten std :: thread starten). –