what - lambda kalkül c++




Binden einer konstanten Funktionsreferenz auf ein Lambda (2)

Ein Lambda kann nur dann in einen Funktionszeiger umgewandelt werden, wenn es nicht erfasst wird.

Der Abschlusstyp für einen Lambda-Ausdruck ohne Lambda-Erfassung verfügt über eine öffentliche, nicht virtuelle, nicht explizite const-Konvertierungsfunktion in einen Zeiger auf eine Funktion mit denselben Parametern und Rückgabetypen wie der Funktionsaufrufoperator des Abschlusstyps. Der von dieser Konvertierungsfunktion zurückgegebene Wert muss die Adresse einer Funktion sein, die beim Aufrufen dieselbe Wirkung hat wie beim Aufrufen des Funktionsaufrufoperators des Abschlusstyps

[Lambda Functions][1]

Ich habe Ihren Code wie folgt geändert und es hat funktioniert.

int (*foo)(int, int)= [] (int a, int b) { return a + b; };
int main()
{
   cout << "Res:: " << foo(10,20);
   return 0;
}

Ich mache es einfach Funktionszeiger.

Alternative,

auto foo = [](int a, int b) { return a + b; }; 

ist auch eine gute Wahl.

Ich hoffe, es hilft!

Dieser Code

int(&foo)(int, int) = [](int a, int b) { return a + b; };

Kompiliert nicht, da anscheinend eine nicht konstante Referenz nicht mit einem temporären Wert initialisiert werden kann. Wo lege ich die const ?


Wie bereits erwähnt, ist ein erfassungsloses Lambda in einen Funktionszeiger umwandelbar. Wenn Sie diese statische Funktion an eine Referenz binden möchten, müssen Sie den Zeiger dereferenzieren.

int(&foo)(int, int) = *[](int a, int b) { return a + b; };

Durch das Anwenden von * auf das Lambda wird eine ganze Reihe von Maschinen aktiviert. Da das Lambda den operator* nicht überlastet, sondern eine Konvertierung in einen Zeigertyp ausführt, erfolgt diese Konvertierung. Danach wird * auf den zurückgegebenen Zeiger angewendet und ergibt eine Funktion lvalue. Dieser Wert kann dann an die Referenz gebunden werden.

Hier ist es live .





lambda