§5.1.2 / 3 besagt:
Der Typ des Lambda-Ausdrucks (der auch der Typ des Closure-Objekts ist) ist ein eindeutiger unbenannter Nicht-Union-Klassentyp
Es wird weiter gesagt, aber das ist das Wichtigste. Ein Lambda ist im Grunde eine Instanz einer anonymen Klasse.
Übrigens ist die entmagnetete Form Ihres Lambda main::$_0
.
Der Typ einer Lambda-Funktion ist durch den Standard (§5.1.2) nicht spezifiziert:
Der Typ des Lambda-Ausdrucks (der auch der Typ des Closure-Objekts ist) ist ein eindeutiger, unbenannter Nicht-Union-Classtyp - der Closure-Typ -, dessen Eigenschaften im Folgenden beschrieben werden. Dieser Klassentyp ist kein Aggregat (8.5.1). Der Closure-Typ wird im kleinsten Blockbereich, Klassenbereich oder Namespacebereich deklariert, der den entsprechenden Lambda-Ausdruck enthält.
Er führt dann die genauen Eigenschaften auf, die ein Schließungstyp haben sollte.
Daher gibt es keinen allgemeinen Typ für eine Lambda-Funktion. Der Compiler generiert einen neuen Funktortyp mit einem nicht angegebenen Namen für jede Lambda-Funktion
Was ist ein Lambda-Ausdruck?
Der Typ eines Lambda-Ausdrucks (die sogenannte closure ) ist ein unbenannter Klassentyp mit einem Funktionsaufruf-Operator, der vom Compiler automatisch generiert wird. Der interne Name, den der Compiler angibt, ist nicht spezifiziert.
Gemäß Absatz 5.1.2 / 3 des C ++ 11 Standards:
Der Typ des Lambda-Ausdrucks (der auch der Typ des Closure-Objekts ist) ist eine eindeutige unbenannte Nicht-Union Klassentyp - der Verschlusstyp genannt -, dessen Eigenschaften im Folgenden beschrieben werden. Dieser Klassentyp ist nicht ein Aggregat (8.5.1). Der Closure-Typ wird im kleinsten Blockbereich, Klassenbereich oder Namespace deklariert Bereich, der den entsprechenden Lambda-Ausdruck enthält. [...]
Beachten Sie auch, dass die name()
-Memberfunktion der type_info
-Klasse (der Typ, der von typeid()
zurückgegeben wird) ebenfalls implementierungsabhängig ist und der Standard nicht verlangt, dass er für einen Menschen sinnvoll ist.
Nach Absatz 18.7.1:
const char* name() const noexcept;
9 Gibt zurück: Ein implementierungsdefiniertes NTBS.
10 Bemerkungen : Die Nachricht kann eine Null-terminierte Multibyte-Zeichenfolge (17.5.2.1.4.2) sein, die zur Umwandlung geeignet ist und als wstring (21.3, 22.4.1.4) angezeigt werden kann