2017-08-21 2 views
-1

Ich habe C++ 2003 zum letzten Mal benutzt und versuche, das neue Zeug zu lernen. Ich arbeite seit einiger Zeit in Java und lerne einfach seine Lambda-Syntax. Ich habe dieses Beispiel in C++ gesehen und mich gefragt, ob jemand es erklären könnte:C++ Lambda und Operatorsyntax

#include "stdafx.h" 
#include <iostream> 
#include <string> 

using namespace std; 

int i = 42; 
char code = 'c'; 

[=, &i]() mutable 
{ 
    i++; 
    code = 'd'; 
    std::cout << "i: " << i << "code " << code << std::endl; 
}(); 


void wait() 
{ 
    cin.clear(); 
    cin.ignore(); 
    cin.get(); 
} 

int main() 
{ 
    std::cout << "i: " << i << "code " << code << endl; 


    // hold output window open 
    wait(); 
    return 0; 
} 

Ist diese neue Lambda-Syntax für operator = overload? Ich würde eine Testfunktion schreiben, bin mir aber nicht sicher, wie ich sie aufrufen soll.

+0

Nein, ist es nicht. Hast du es versucht und beobachtet, was passiert? – litelite

+0

Nein, ist es nicht. Sie sollten etwas über Lambdas lesen. Als Nebenbemerkung wird dieses '' cout :: endl; ''nicht kompiliert. – Ron

+0

https://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11 –

Antwort

0

Die = bedeutet, dass es alle Variablen nach Wert erfasst, &i gibt an, dass i durch Bezugnahme erfasst werden muss.

Die mutable bedeutet, dass es Eingangsparameterwerte ändern kann. Und da es keine gibt, hat das überhaupt keinen Effekt.

0

[] vor der Lamda ist die Capture-Liste für das Lambda. Wenn es [=] sagt, erfasst es alle automatischen Variablen, die in dem Lambda von Kopie verwandt werden. In Ihrem Fall bedeutet dies i wird durch Referenz erfasst und code (die andere automatische Variable innerhalb des Lambda verwendet) wird durch Kopie erfasst.

Die mutable bedeutet, dass die Variablen veränderlich erfasst werden, so dass das Lambda die erfassten Variablen ändern kann. Aber das Lambda hier ändert sowieso keine erfassten Variablen ...

0

Ich kann nicht auf Kommentare antworten, da ich immer noch 50 Rep-Punkte habe (meine vorherige Antwort wurde automatisch in Kommentare verschoben, wie es gerade war eine Verbindung).

Ich habe einen einfachen Weg gefunden, Lambda-Ausdrücke zu testen, aber ich verstehe den Zweck Ihres Codebeispiels nicht, also poste ich es hier raw. Ich hoffe, es hilft, es aus dem Buch SFML Game Development ist und verwendet std::functions

int add(int a, int b) { return a + b }; 
// Assign a lambda expression to a function 
std::function<int(int, int)> adder1 = [] (int a, int b) { return a + b; }; 

int sum = adder1(3, 5); // same as add(3, 5)