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.
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
):
Jeder von diesen ist kopierbar und nicht zuweisbar.