2014-09-13 8 views
8

Ich habe ein Programm wie folgt:C++ Lambda Kopie Wert in Capture-Liste

int main() 
{ 
    int val = 4; 
    auto add = [val](int a)->int{ 
     val += 2; 
     return a+val; 
    }; 
    cout << add(3) << endl; 
    cout << val << endl; 
    return 0; 
} 

Es gibt einen Übersetzungsfehler in Xcode: Kann nicht auf eine Variable durch Kopie in einem nicht-veränderbaren Lambda erfaßt zuweisen.

Meine Frage ist: Wenn wir die Kopie verwenden (mit "=" oder Wertname), kann diesem Wert kein neuer Wert zugewiesen oder geändert werden?

+0

mögliche Duplikate von [Warum benötigt das Lambda von C++ 0x standardmäßig ein "veränderbares" Schlüsselwort für Capture-by-Value?] (Http://stackoverflow.com/questions/5501959/why-does-c0xs-lambda -require-mutable-keyword-for-capture-by-value-by-defau – AndyG

Antwort

10

In einem Lambda sind erfasste Variablen standardmäßig unveränderlich. Das hängt nicht von den erfassten Variablen oder der Art und Weise ab, wie sie erfasst wurden. Vielmehr wird der Funktionsaufruf Betreiber des Verschlusstypen const erklärt:

Diese Funktion Call-Betreiber oder Betreiber Vorlage deklariert werden const (9.3.1), wenn und nur wenn der Lambda-Ausdruck des Parameter-declaration- Klausel wird nicht gefolgt von mutable.

Deshalb, wenn Sie die erfassten Variablen modifizierbar im Inneren des Körpers machen wollen, ändern Sie einfach den Lambda

auto add = [val] (int a) mutable -> int { 
    val += 2; 
    return a+val; 
}; 

so die const -specifier entfernt wird.

8

Die operator() einer Lambda ist implizit const es sei denn, der Lambda-mutable deklariert wird - und Sie können die Datenelemente in einer const Member-Funktion ändern. Dies geschieht unabhängig vom Typ des Captures.