Wie funktioniert generisches Lambda ( auto
Schlüsselwort als Argumenttyp) im C ++ 14-Standard?
Basiert es auf C ++ - Vorlagen, bei denen der Compiler für jeden unterschiedlichen Argumenttyp eine neue Funktion mit demselben Text generiert, aber Typen ersetzt (Polymorphismus zur Kompilierungszeit), oder ähnelt er eher den Java-Generika (Typlöschung)?
Codebeispiel:
auto glambda = [](auto a) { return a; };
Antworten:
Generische Lambdas wurden in eingeführt
C++14
.Der durch den Lambda-Ausdruck definierte Schließungstyp hat einfach einen Aufrufoperator mit Vorlagen anstelle des regulären
C++11
Anrufoperators ohne Vorlage von Lambdas (natürlich, wenn erauto
mindestens einmal in der Parameterliste erscheint).Also dein Beispiel:
Wird
glambda
eine Instanz dieses Typs erstellen:In Abschnitt 5.1.2 / 5 des C ++ 14 Standard Draft n3690 wird festgelegt, wie der Aufrufoperator des Schließungstyps eines bestimmten Lambda-Ausdrucks definiert wird:
Schließlich:
Wie im obigen Absatz erläutert, sind generische Lambdas nur syntaktischer Zucker für einzigartige, unbenannte Funktoren mit einem Vorlagenbetreiber. Das sollte deine Frage beantworten :)
quelle
int main () { struct X {}; std::vector<X> x; }
)Leider sind sie nicht Teil von C ++ 11 ( http://ideone.com/NsqYuq ):
Mit g ++ 4.7:
Die Art und Weise, wie es in C ++ 14 gemäß dem Portland-Vorschlag für generische Lambdas implementiert werden könnte :
Dies würde zum größten Teil die übliche Erstellung einer anonymen Funktorklasse ergeben, aber mit dem Mangel an Typen würde der Compiler ein Mitglied mit Vorlagen ausgeben
operator()
:Oder gemäß dem neueren Vorschlag Vorschlag für generische (polymorphe) Lambda-Ausdrücke
Ja, für jede Permutation von Parametern würde eine neue Instanziierung entstehen, die Mitglieder dieses Funktors würden jedoch weiterhin geteilt (dh die erfassten Argumente).
quelle
-std=c++1y
.auto
die gleichen Abzugsregeln wie das klassische Auto? Wenn wir uns auf die Vorlagenanalogie beziehen, würde dies bedeuten, dass das Auto nicht automatisch ist, sondern dieselben Regeln wie der Abzug des Vorlagentyps. Dann lautet die Frage: Ist der Vorlagenabzug gleichbedeutend mitauto
?static
oder verwendet.register
Wie auch immer, ja, wenn Sie dort verwendenauto
, wird unter der Haube eine normale Vorlage generiert. Tatsächlich wird ein Lambda compilerintern durch eine Funktorklasse ersetzt, und einauto
Parameter bedeutet, dasstemplate <T> ... (T ...)
ausgegeben wird.Es ist eine vorgeschlagene C ++ 14-Funktion (nicht in C ++ 11), die Vorlagen ähnelt (oder sogar gleichwertig ist). Zum Beispiel bietet N3559 dieses Beispiel:
quelle