2016-06-21 4 views
14

Ich betrachte das folgende (vermutlich C++ 14) Stück CodeZuordnung in Lambda

auto min_on = [](auto&& f) { 
    return [f=decltype(f)(f)](auto&& arg0, auto&&...args) { 
    // call your function here, using decltype(args)(args) to perfect forward 
    }; 
} 

was ist die seltsame Zuordnung in der Lambda-Capture-Liste? Ich habe noch nie eine Zuweisung in einer Erfassungsliste gesehen

f=decltype(f)(f) 

Wie funktioniert das?

+0

Wenn Sie eine Funktion zurückgeben, können Sie sie sofort anrufen –

Antwort

14

Das ist eine Generalized Lambda Capture, und ja, es ist C++ 14.

Grundsätzlich können Sie eine neue Variable als Teil der Erfassungsliste erstellen.

Text von Link:

In C++ 11, lambda konnte nicht (leicht) Erfassung von Bewegung. In C++ 14 haben wir verallgemeinerte Lambda-Capture, die nicht nur dieses Problem löst, aber können Sie beliebige neue lokale Variablen im Lambda Objekt definieren. Zum Beispiel:

auto u = make_unique<some_type>(some, parameters); // a unique_ptr is move-only 
go.run([ u=move(u) ] { do_something_with(u); }); //move the unique_ptr into the lambda 

Im obigen Beispiel hielten wir die Namen der Variablen u die gleichen innerhalb des Lambdas. Aber wir sind nicht begrenzt auf, dass ... wir Variablen umbenennen:

go.run([ u2=move(u) ] { do_something_with(u2); }); // capture as "u2" 

Und wir können mit dem Lambda-Objekt beliebigen neuen Zustand hinzufügen, weil jeder Erfassung einer neuen Art-abgeleitete lokale Variable innerhalb des Lambda erzeugt :

int x = 4; 
int z = [&r = x, y = x+1] { 
      r += 2;   // set x to 6; "R is for Renamed Ref" 
      return y+2;  // return 7 to initialize z 
     }(); // invoke lambda 

In Ihrem speziellen Fall haben Sie eine Lambda, die eine Lambda zurückkehrt. Das verschachtelte Lambda erfasst f (was nur ein Parameter im übergeordneten Lambda war), indem diese neue Syntax verwendet wird.

+3

Ich würde hinzufügen, dass 'declltype (f) (f)' in diesem Kontext eine Art zu schreiben 'std :: forward (f)' seit Sie können ' t eigentlich "T" nennen. – Brian

+0

@Brian was 'T' redest du? – Dean

+0

@Der Typ, der für den Platzhalter 'auto' abgeleitet wurde. – Brian