c ++ 14 führte generische Lambdas ein, die es ermöglichten, Folgendes zu schreiben:
auto func = [](auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Es ist sehr klar, dass dieses generische Lambda func
genau so funktioniert, wie eine Vorlagenfunktion funktionieren func
würde.
Warum hat das C ++ - Komitee beschlossen, eine Vorlagensyntax für generisches Lamda hinzuzufügen?
c++
c++14
c++20
generic-lambda
coder3101
quelle
quelle
Antworten:
C ++ 14 generische Lambdas sind eine sehr coole Möglichkeit, einen Funktor mit einem folgenden Format zu generieren
operator ()
:Aber nicht so:
Noch so:
Auch nicht so (obwohl es etwas schwierig wird, es tatsächlich zu benutzen):
C ++ 14 Lambdas sind in Ordnung, aber mit C ++ 20 können wir diese Fälle problemlos implementieren.
quelle
(auto a, decltype(a) b)
in C ++ 14 gelöst werden .b
wird nicht abgeleitet, und ihr Argument wird implizit in den Typ vona
stattdessen konvertiert .Da Sie in C ++ 20 Lambdas mit Vorlagen verwenden können, können Sie Ihre Typen einfacher einschränken als mit einem SFINAE-Ausdruck:
Dieses Lambda funktioniert nur mit Vektortypen.
quelle
consteval
mit der neuen Syntax zusammen? Es ist cool und alles, aber ich verstehe die Relevanz nicht.Der Vorschlag , der in C ++ 20 angenommen wurde, enthält einen langen Motivationsabschnitt mit Beispielen. Die Prämisse davon ist folgende:
Daran schließen sich einige Beispiele an.
quelle
(Quelle: Iteration zur Kompilierungszeit mit C ++ 20 Lambdas )
Eine weitere interessante Funktion, die sowohl für generische C ++ 14- als auch für C ++ 17-Lambdas ausgeführt werden kann, ist das direkte Aufrufen
operator()
durch explizite Übergabe eines Vorlagenparameters:C ++ 14:
C ++ 20:
Das obige C ++ 14-Beispiel ist ziemlich nutzlos: Es gibt keine Möglichkeit, auf den Typ zu verweisen, der
operator()
im Hauptteil des Lambda angegeben ist, ohne dem Argument einen Namen zu geben und es zu verwendendecltype
. Außerdem müssen wir ein Argument übergeben, obwohl wir es möglicherweise nicht benötigen.Das C ++ 20-Beispiel zeigt, wie T im Körper des Lambda leicht zugänglich ist und dass ein Null-Lambda nun willkürlich als Vorlage verwendet werden kann. Dies wird für die Implementierung der oben genannten Konstrukte zur Kompilierungszeit sehr nützlich sein
quelle