Jeg antar at du har erfaring med lambdas fra C #, så det vi skal gjøre her, er å dekke syntaksen C ++ har vedtatt. Alle kodeutdrag er fra samme fil i samme prøve.
Eksempel: LambdaSample \ LambdaSample.cpp
// Lag en lambda-uttrykksavslutning. auto lm1 = [] () wcout << L"No capture, parameterless lambda." << endl; ; // Invoke the lambda. lm1();
// Lag en lambda-lukning med parametere. auto lm2 = [] (int a, int b) wcout << a << L" + " << b << " = " << (a + b) << endl; ; lm2(3,4);
Den etterfølgende retur typen her er -> int etter parameter spesifikasjonen.
// Lag en lambda-lukning med en tilbaketrukket returtype. auto lm3 = [] (int a, int b) -> int wcout << a << L" % " << b << " = "; return a % b; ; wcout << lm3(7, 5) << endl;
int a = 5; int b = 6; // Capture ved å kopiere alle variabler som for tiden er i bruk. // Merk også at vi ikke trenger å fange lukningen; // her anvender vi bare den anonyme lambda med // () etter avsluttende brace. [=] () wcout << a << L" + " << b << " = " << (a + b) << endl; //// It's illegal to modify a here because we have //// captured by value and have not specified that //// this lambda should be treated as mutable. //a = 10; (); [=]() mutable -> void wcout << a << L" + " << b << " = " << (a + b) << endl; // By marking this lambda as mutable, we can now modify a. // Since we are capturing by value, the modifications // will not propagate outside. a = 10; (); wcout << L"The value of a is " << a << L"." << endl; [&]() wcout << a << L" + " << b << " = " << (a + b) << endl; // By capturing by reference, we now do not need // to mark this as mutable. // Because it is a reference, though, changes now // propagate out. a = 10; (); wcout << L"The value of a is " << a << L"." << endl; // Here we specify explicitly that we are capturing a by // value and b as a reference. [a,&b]() b = 12; wcout << a << L" + " << b << " = " << (a + b) << endl; (); // Here we specify explicitly that we are capturing b as // a reference and that all other captures should be by // value. [=,&b]() b = 15; wcout << a << L" + " << b << " = " << (a + b) << endl; (); // Here we specify explicitly that we are capturing a by // value and that all other captures should be by reference. [&,a]() b = 18; wcout << a << L" + " << b << " = " << (a + b) << endl; ();
Når du bruker en lambda i en klassemedlem-funksjon, kan du ikke bruke en standardopptak ved referanse. Dette skyldes at lambda vil bli forsynt med en denne pekeren, og den må kopieres. Også når man arbeider med referanseberegnede smarte pekere, er det vanlig å få problemer med lambdaen som holder en referanse til klassen. Vanligvis vil du aldri komme tilbake til et referansetall på null, noe som forårsaker minnelekkasje i programmet.
Hvis du er kjent med lambda-uttrykk i C #, bør du ikke ha det vanskelig å bli vant til syntaksen i C ++. I neste artikkel tar vi en titt på C ++ Standard Library.
Denne leksjonen representerer et kapittel fra C ++ Succinctly, en gratis eBok fra teamet på Syncfusion.