Art der Lambda-Funktion [duplizieren]

7

Es gibt diesen Code:

%Vor%

Das Ergebnis ist: Z4mainEUliE_ , aber c ++ filt scheint nicht zu erklären, was es ist. Was ist ein Lambda-Ausdruck?

    
scdmb 07.03.2013, 19:01
quelle

3 Antworten

10

§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 .

    
Kevin Ballard 07.03.2013, 19:07
quelle
6

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

    
Grizzly 07.03.2013 19:07
quelle
6
  

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

    
Andy Prowl 07.03.2013 19:07
quelle

Tags und Links