expresii Lambda în c

Lambda (sau lambda) în 11 C ++ - o metodă convenabilă pentru determinarea obiectului funcției anonim direct la punctul apelului sau transferul funcției ca argument. De obicei, expresii lambda sunt folosite pentru a încapsula câteva linii de cod, algoritmi transmise sau metode asincrone. Acest articol oferă o definiție a expresiilor lambda, compararea lor cu alte metode de programare, o descriere a avantajelor lor și exemplu simplu.

In ISO C ++ Standard este prezentat un simplu lambda transmis std funcția :: sort () ca al treilea argument:

Următoarea figură prezintă structura expresiei lambda:

expresii Lambda în c

oferta de fixare (în C ++ este specificația lambda-introducer.)

o listă de parametri (opțional). (De asemenea, menționată ca declarator lambda.)

caietul de sarcini comutabil (opțional).

excepțiile de specificație (opțional).

de încheiere a tipului de retur (opțional).

Propunerea de fixare

In corpul expresiei lambda poate introduce noi variabile (în C ++ 14). În plus, expresii lambda pot fi folosite, sau repara. variabile din domeniul de aplicare înconjurător. Lambda-expresie începe cu fixarea propoziția (în sintaxa standard, - lambda-introducer), care specifică fixate prin variabile și metoda de fixare prin valoare sau prin referință. Variabilele de acces prefixate cu un ampersand ( ) Se desfășoară pe link-ul, iar variabilele fără prefix - semnificativ.

fixare licitată Blank ([]) indică faptul că organismul lambda nu avea acces la variabilele din regiunea exterioară a vizibilității.

Pentru a specifica modul de stabilire a variabilelor externe se face referire printr-o expresie lambda, puteți utiliza modul implicit de blocare (în sintaxa standardului - captare-default): [] - toate variabilele sunt fixate prin referință, [=] - prin valoare. Aveți posibilitatea să utilizați mai întâi modul de blocare implicit, și apoi se aplică pentru anumite variabile alt mod. De exemplu, în cazul în care corpul expresiei lambda accesează total variabilă externă prin referință, la factorul variabil extern al valorii, următoarele sunt de fixare echivalente oferă:

Pentru a utiliza expresii lambda în corpul unei metode de clasă, trebuie să treacă un pointer la această propunere de fixare, pentru a permite accesul la metode și date membrii clasei de îngrădire. Exemplu expresiile lambda cu metodele claselor cm. In expresiile exemplele lambda (subsecțiunea „Utilizarea în metoda Lambda“).

La utilizarea propunerilor de fixare recomandate amintesc aceste aspecte importante, mai ales atunci când se utilizează expresii lambda multithreading:

Fixarea de referință pot fi utilizate în afara, în timp ce fixarea este imposibil de a schimba valorile variabilelor. (Mutabil vă permite să modificați copia, dar nu și originalele.)

Fixarea link-uri reflectă o schimbare de variabile din exterior, în timp ce stabilirea valorilor - nr.

Fixarea link-uri introduce dependența de existența timpului, în timp ce stabilirea valorii nu are o dependență de existența timpului. Acest lucru este deosebit de important în cazul expresiilor utilizarea lambda asincrone. În cazul în care expresia lambda link-ul asincron este variabilă fixă ​​locală, este posibil ca la momentul apelului său, acesta va fi disponibil, ceea ce va provoca o excepție de violare a accesului în timpul execuției.

Fixarea Generalized (C ++ 14)

În C ++ 14, puteți declara și inițializa o nouă variabilă în stabilirea propunerii. Aceasta nu impune ca aceste variabile au existat în regiunea exterioară a domeniului de aplicare funcției lambda. Inițializarea poate fi exprimată ca orice expresii arbitrare. Tastați o nouă variabilă este determinată de tipul de expresie care este creat. Un avantaj al acestei funcții este că în C ++ 14, astfel încât să puteți captura variabile din domeniul de aplicare înconjurătoare, accesibile numai pentru a muta (de exemplu, std :: unique_ptr), și să le utilizeze în expresia lambda.

Expresia Lambda poate crea o altă expresie lambda ca valoare de retur. Pentru mai multe informații, a se vedea. În secțiunea Exemple expresiile Lambda (secțiunea „ordin superior Lambda Expresiile“).

corp lambda

Partea care cuprinde Lambda corpul (standard sintaxa compus statement) poate cuprinde aceleași elemente ca metoda sau corpului funcțiile convenționale. funcțiile corpului normală și expresii lambda pot accesa următoarele tipuri de variabile:

Variabilele externe fixe ale domeniului de aplicare (cm. mai sus).

La nivel local a declarat variabile

Orice variabilă care are o durată de stocare statică (de exemplu, o variabilă globală)

Exemplul următor conține expresia lambda, care blochează în mod evident Variabila n și valoarea lui m este implicit angajată variabilă link.

5
0 Deoarece n variabilă este fixată la o valoare, valoarea sa după ce apelul rămâne egal Lambda la 0. specificația mutabile permite să se schimbe în termen de expresii n lambda.

În ciuda faptului că o expresie lambda poate captura doar variabilele cu durata de stocare automată, în corpul expresiei lambda poate utiliza variabile care au o durată de stocare statică. În exemplul următor genera o funcție sau o expresie lambda este folosită pentru a atribui o valoare pentru fiecare element al obiectului vectorial. Expresia Lambda schimbă variabila statica pentru a obține valoarea elementului următor.

Visual Studio susține sintaxa și funcția de expresii lambda standard C ++ 11, cu următoarele excepții:

La fel ca toate celelalte clase, expresii lambda nu începe în mod automat de către proiectanții și operatorii mutați cu mișcarea misiunii. Pentru mai multe informații despre suportul pentru referințe rvalue, a se vedea. În calitate de suport C ++ 11/14/17 (sub-secțiunea „Referințe rvalue“).

Opțional atribut-Specificator-seq nu este acceptată în această versiune.

Visual Studio include următoarele caracteristici, în plus față de funcțiile de lambda expresii C ++ standard de 11:

apatride sunt universal Lambda convertibile să funcționeze indicii cu convenția de asteptare arbitrară.

Tipuri de returnare derivate în mod automat pentru expresiile corpului lambda, care sunt mai complicate decât . cu condiția ca toate expresiile de returnare se referă la același tip. (Această caracteristică face parte din C ++ standard propusă 14.)