Sollte ich ein Lambda durch const Referenz übergeben.

8

Normalerweise verwende ich das folgende Muster, wenn ich ein Lambda als Argument für eine Funktion akzeptiere (Eine Template-Klasse, die als Wert übergeben wurde):

%Vor%

Ist diese Kopie (das Schließen) des Arguments? Wenn ja, ist es falsch, stattdessen das Lambda durch const-Referenz zu akzeptieren?

%Vor%

Ein einfacher Test scheint darauf hinzuweisen, dass dies gut funktioniert, aber ich möchte wissen, ob es spezielle Überlegungen gibt, die ich beachten sollte.

    
jwheels 07.07.2015, 23:00
quelle

2 Antworten

10

Wenn Sie den Wert übergeben, kopieren Sie das Closure-Objekt (vorausgesetzt, Sie definieren das Lambda nicht inline, in diesem Fall wird es verschoben). Dies kann unerwünscht sein, wenn der Zustand teuer zu kopieren ist, und wird nicht kompiliert, wenn der Status nicht kopierbar ist.

%Vor%

Wenn Sie an const reference übergeben, können Sie kein mutable lambda übergeben, das seine Datenelemente als Argument für higherOrderFunction() ändert, weil ein mutable lambda ein nicht const operator() hat. und Sie können das nicht auf einem const -Objekt aufrufen.

%Vor%

Am besten verwenden Sie eine Weiterleitungsreferenz. Dann kann higherOrderFunction entweder lvalues ​​oder rvalues ​​akzeptieren, die der Aufrufer übergibt.

%Vor%

Dies ermöglicht sowohl die einfachen Fälle als auch die oben genannten zu kompilieren. Eine Erläuterung, warum std::forward verwendet werden sollte, finden Sie unter diese Antwort .

Live-Demo

    
Praetorian 07.07.2015, 23:41
quelle
1

Eine Kopie ist eine Kopie, so dass Sie das Original nicht mutieren können. Dies kann Auswirkungen auf die Leistung haben, wenn viele Daten beteiligt sind:

%Vor%

Sehen Sie in Aktion .

Nicht vergessen: Lambdas sind nur syntaktischer Zucker für aufrufbare Klassen. (Aber sehr hilfreich)

    
Daniel Jour 08.07.2015 00:11
quelle