Der Lambda-Ausdruck existiert, um den Code zu vereinfachen. Dies:
auto fun = []() { return; };
mit vom Compiler ersetzt:
// Namespace scope
struct __lambda_1 {
void operator()() { return; }
};
// local scope
__lambda_1 fun{};
Dies ist die primäre Motivation für die Lambda-Syntax: Um traditionelle Funktionsobjekte mit einem einfacheren zu ersetzen erklärte anonyme Funktion an der Stelle zu lesen, wo Es wird benötigt, anstatt ein separates Funktionsobjekt zu haben, das in einem anderen Bereich deklariert werden muss. Es soll nicht nur benannte Funktionsobjekte ersetzen.
In der Tat enthält die Standardbibliothek eine Reihe von benannten Funktionsobjekten wie std::unary_function
und Dinge wie std::less
. Diese Objekte haben jedoch einen begrenzten Nutzen und können nicht jede potentielle Rolle übernehmen, die ein Lambda hätte.
So, ja, es kann Code wesentlich lesbarer machen, indem er Code platziert, der die Standardbibliothek nicht genau dort bereitstellt, wo er benötigt wird, ohne deinen Code mit dutzend Zeilen struct
s zu verschmutzen und deinen Namespace mit Namen zu beschmutzen ' Ich werde wahrscheinlich nicht mehr als ein- oder zweimal verwenden.
Die Lambda-Version ist nicht mehr. Die Nicht-Lambda-Eins ist unvollständig, da wir nicht die Definition von "Less_than" haben. –
Wie ist das 'Less_than (x)' eine "normale Funktionsdefinition" ??? Nach Ihrem ersten Beispiel sieht es so aus, als müssten Sie den Wert von "x" an einen Komparator mit zwei Parametern binden und diesen in einen Komparator mit einem einzigen Parameter umwandeln. Dies ist bereits eine Funktionalität, die weit über die "normale Funktionsdefinition" hinausgeht. –
AnT