Was passiert, wenn ein Typ mit einem Lambda zugewiesen wird?

8

Angenommen, ich habe einen Typ, der eine Funktion umschließt, vielleicht eine Lambda-Funktion:

%Vor%

Was passiert, wenn eine Instanz dieses Typs zugewiesen wird? Mein Verständnis ist, dass Lambdas unveränderlich sind und Zuweisungsoperatoren gelöscht haben.

Wenn ich jedoch im folgenden Code-Snippet einem Objekt diesen Typ zuweise, wird kein Fehler ausgegeben:

%Vor%

Das Hinzufügen des auskommentierten Zuweisungsoperators führt wie erwartet zu einem Fehler:

%Vor%

Also, ist es möglich, zuweisbare Typen mit Lambda-Member-Variablen zu erstellen? Das scheint vernünftig zu sein. Erwägen Sie beispielsweise, ein Lambda mit boost::transform_iterator zu kombinieren.

    
Jared Hoberock 12.12.2011, 21:52
quelle

1 Antwort

12

Sie sind nah dran. Ein Lambda hat einen impliziten Kopierkonstruktor und kann - abhängig von den erfassten Werten - einen impliziten move-Konstruktor haben. Es hat einen gelöschten Kopierzuweisungsoperator.

Mit anderen Worten, Sie können es konstruieren, aber Sie dürfen es nicht zuweisen. Wenn Sie nach einem generischen Funktionsobjekt suchen, möchten Sie std::function<> verwenden. Es emuliert Funktionen als erstklassige Werte.

Beachten Sie, dass immutable sich von assignable unterscheidet. Wenn ein Lambda als änderbar bezeichnet wird, bedeutet dies, dass sein Funktionsaufruf-Body die Elemente von Lambda ändern kann (d. H. Die Funktion ist nicht const ):

%Vor%

Jeder von diesen ist kopierbar und nicht zuweisbar.

    
GManNickG 12.12.2011, 22:00
quelle

Tags und Links