Lambda kifejezések c
Lambda (vagy lambda) a C ++ 11 - kényelmes módszer meghatározására névtelen függvényt objektumot közvetlenül azon a ponton, a hívás, illetve át a funkciót, mint egy érv. Jellemzően lambda-kifejezések magukba néhány sornyi kódot, átvitt algoritmusok vagy aszinkron módszerek. Ez a cikk meghatározása lambda kifejezéseket, összehasonlítására más programozási módszerek leírását az előnyei és egyszerű példa.
Az ISO C ++ szabvány ábrán egy egyszerű lambda továbbított funkció std :: sort () a harmadik érv:
A következő ábra a szerkezet a lambda expressziós:
ajánlatot rögzítés (C ++ lambda-bevezető specifikáció.)
a paraméterek listája (opcionális). (Is nevezik lambda declarator.)
kapcsolható leírás (opcionális).
leírás kivételek (opcionális).
megszüntetéséről visszatérési típus (opcionális).
A javaslat rögzítő
A szervezetben a lambda kifejezés hozhat be új változókat (C ++ 14). Ezen túlmenően, lambda kifejezéseket lehet használni, vagy fix. változókat a környező hatálya alá. Lambda-expresszió kezdődik rögzítéséről mondat (standard szintaxis - lambda-bevezető), amely meghatározza a rögzített változók, és rögzítési módja szerint értéken vagy a referencia. Access változók előtaggal jel ( ) Hajtjuk a linkre, és a változók előtag nélkül - érdemben.
Üres licit rögzítés ([]) azt jelzi, hogy a lambda szerv nem fér hozzá, hogy a változók külső tartományában látható.
Ahhoz, hogy adja meg a rögzítési módja a külső változók által hivatkozott lambda kifejezés, akkor az alapértelmezett biztonsági üzemmód (a szintaxis a szokásos - fogás-alap): [] - az összes változó által meghatározott referencia [=] - érték alapján. Akkor először használja az alapértelmezett zár módban, majd alkalmazni változókat más módot. Például, ha a test a lambda expressziós belép a külső változó teljes hivatkozással, a külső változó tényező értéke, a következő ekvivalensek rögzítés kínálja:
Ahhoz, hogy használni lambda kifejezéseket a test egy osztály módszer, meg kell felelnie egy mutatót a javaslat a rögzítés, hogy hozzáférést biztosítson a módszerek és adatok a tagok a befoglaló osztály. Példa a lambda kifejezéseket az módszerek osztályok cm. A példákban a lambda kifejezéseket (alszakasz „használata lambdas a módszer”).
Ha a rögzítő ajánlott javaslatokat emlékezni ezeket a fontos szempontokat, különösen akkor, ha a lambda kifejezések többszálas:
Rögzítése referencia kívül is használható, míg a rögzítés lehetetlen megváltoztatni változók értékeit. (Változékony lehetővé teszi, hogy módosítsa a másolatot, de nem az eredeti.)
Rögzítése linkek tükrözi változás változók kívülről, mivel a rögzítő értékek - nincs.
Rögzítése linkek bevezeti függőség megléte idő, míg értékének rögzítésére nincs függőség megléte időben. Ez különösen fontos abban az esetben, aszinkron használat lambda kifejezéseket. Ha az aszinkron kapcsolat lambda kifejezés rögzített lokális változó, akkor valószínű, hogy az idejét hívást, akkor lesz elérhető, amelynek hatására egy access violation kivétel a végrehajtás során.
Általános rögzítés (C ++ 14)
A C ++ 14, akkor állapítsa meg, és inicializálni egy új változó a javaslatban rögzítés. Ez nem követeli meg, hogy ezek a változók létezett a külső tartományában a lambda funkció körét. Inicializálás fejezhető ki tetszőleges kifejezéseket. Írja be az új változó típusa határozza meg a kifejezés, hogy jön létre. Ennek egyik előnye az jellemző, hogy a C ++ 14 így elfog változókat a környező körét, ahová csak mozogni (pl std :: unique_ptr), és használja őket a lambda kifejezés.
Lambda kifejezés létrehozhat egy másik lambda kifejezés, mint a visszatérési érték. További információért lásd. A példákban Lambda kifejezések (a „magasabb rendű Lambda kifejezések”).
lambda test
Rész lambdas testét tartalmazó (vegyület-nyilatkozat szintaxis standard) tartalmazhat azonos elemeket, mint a hagyományos eljárással vagy a szervezet funkcióit. Normál test funkcióit és lambda kifejezéseket elérheti az alábbi változók:
Rögzített külső változók körének (cm. Fent).
Helyileg deklarált változókat
Bármely változó, amely a statikus tárolási idő (például egy globális változó)
A következő példa tartalmazza a lambda expressziós, ami nyilvánvalóan reteszeli az n változó értéke és az m értéke implicite elkötelezett Link-változó.
5
0 Mivel az n változó van rögzítve egy értéket, annak értékét a hívás után lambdas egyenlő marad 0. változékony specifikáció lehetővé teszi, hogy változtatni belül n lambda kifejezéseket.
Annak ellenére, hogy a lambda kifejezés elfog csak a változók automatikus tárolási időtartamát, a test a lambda kifejezés használható változók, amelyek statikus tárolási időtartamát. A következő példában generál egy funkció vagy lambda kifejezés arra használjuk, hogy értéket rendelni minden egyes eleme a vektoros objektum. Lambda kifejezés megváltoztatja a statikus változót, hogy az érték a következő elem.
Visual Studio támogatja a szintaxist és a lambda kifejezéseket C ++ 11 szabvány szerint, az alábbi kivételekkel:
Mint minden más osztályokba, lambda kifejezéseit nem automatikusan elindítja a tervezők és üzemeltetők mozog a mozgás a feladat. További információt a támogatást rvalue referenciákat lásd. A támogatási kapacitását C ++ 11/14/17 (alfejezet „rvalue Hivatkozások”).
Az opcionális attribútum-specifikátor-seq nem támogatja ez a verzió.
Visual Studio az alábbi funkciók mellett a funkciók lambda kifejezéseket C ++ szabvány 11:
Hontalan lambdas univerzálisan átalakítható függvénymutatók tetszőleges hívási konvenciót.
Automatikusan származó hozam típusok a test lambda kifejezéseket, amelyek bonyolultabbak, mint a