Lambda als Argument übergeben - durch Referenz oder Wert?

8

Ich habe einen Template-Code geschrieben, der einen Funktor als Argument akzeptiert und ihn nach einer gewissen Verarbeitung ausführt. Obwohl jemand anderes dieser Funktion ein Lambda, einen Funktionszeiger oder sogar std::function übergeben könnte, ist es hauptsächlich für Lambda gedacht (nicht, dass ich andere Formate verbiete). Ich möchte fragen, wie soll ich dieses Lambda nehmen - nach Wert? durch Referenz? oder etwas anderes.

Beispielcode -

%Vor%

In obigem Code habe ich die Wahl, es entweder zu machen -

%Vor%

Was wäre der bessere Weg und warum? Gibt es irgendwelche Einschränkungen für diese?

    
hg_git 21.02.2017, 16:43
quelle

2 Antworten

4

Als einen möglichen Nachteil, beachten Sie, dass die Weitergabe nach Kopie nicht funktionieren konnte, wenn das Lambda nicht kopierbar ist. Wenn Sie damit durchkommen können, ist die Weitergabe an die Kopie in Ordnung Als Beispiel:

%Vor%

Im obigen Ausschnitt ist lambda aufgrund von foo nicht kopierbar. Der Kopierkonstruktor wird gelöscht, weil der Kopierkonstruktor von std::unique_ptr gelöscht wird.
Auf der anderen Seite akzeptiert F &&f sowohl lvalue- als auch rvalue-Referenzen als Weiterleitungsreferenz sowie als const-Referenzen.
Mit anderen Worten, wenn Sie das gleiche Lambda als ein Argument mehr als einmal verwenden möchten, können Sie nicht, wenn Ihre Funktionen Ihr Objekt per Kopie erhalten, und Sie müssen es verschieben, damit es nicht kopierbar ist (naja, eigentlich Sie kann, es ist eine Sache, es in ein Lambda zu wickeln, das den äußeren durch Verweis fängt).

    
skypjack 21.02.2017, 17:05
quelle
3

Da Lambda-Ausdrücke ihre eigenen Felder (wie Klassen) haben können, kann das Kopieren / Verwenden von Referenzen zu unterschiedlichen Ergebnissen führen. Hier ist ein einfaches Beispiel:

%Vor%

Übrigens, wenn Sie es nach Leistung beurteilen wollen, gibt es eigentlich keinen Unterschied, Lambdas sind sehr klein und einfach zu kopieren.

Auch - wenn Sie Lambda als Parameter (nicht eine Variable, die es enthält) übergeben möchten, sollten Sie die Weiterleitungsreferenz verwenden, damit es funktioniert.

    
Kamil Koczurek 21.02.2017 17:00
quelle

Tags und Links