Sdílet prostřednictvím


Lambda syntaxi výrazu

Toto téma popisuje syntaxi lambda výrazů.Poskytuje Příklad demonstrující konstrukční prvky lambda výraz a jak souvisí tyto prvky v příkladu.

Následující program používá lambda výrazy s dvěma STL algoritmy: generate_n a for_each.Lambda výraz, který se zobrazí při volání generate_n funkce přiřadí prvek vector objektu součtu předchozí dva prvky.Lambda výraz, který se zobrazí při volání for_each funkce vytiskne stejný prvek vector objektu do konzoly.

// lambda_structure.cpp
// compile with: /EHsc
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

// The number of elements in the vector.
const int elementCount = 9;

int main() 
{
   // Create a vector object with each element set to 1.
   vector<int> v(elementCount, 1);

   // These variables hold the previous two elements of the vector.
   int x = 1;
   int y = 1;

   // Assign each element in the vector to the sum of the 
   // previous two elements.
   generate_n(v.begin() + 2, elementCount - 2, [=]() mutable throw() -> int {
      
      // Generate current value.
      int n = x + y;

      // Update previous two values.
      x = y;
      y = n;

      return n;
   });

   // Print the contents of the vector.
   for_each(v.begin(), v.end(), [](int n) { cout << n << " "; });
   cout << endl;

   // Print the local variables x and y.
   // The values of x and y hold their initial values because 
   // they are captured by value.
   cout << x << " " << y << endl;
}

Další informace o generate_n fungovat, viz generate_n.Další informace o for_each fungovat, viz for_each.

Následující oddíly popisují gramatiku lambda výraz a jak souvisí každý prvek v předchozím příkladu.

Lambda výraz gramatiky

Následující formální definici gramatiky, zobrazí ve formátu BNF lambda výraz:

Lambda výraz

   : Představení lambda lambda parametr prohlášeníopt sloučenina prohlášení

Lambda Představení

   : [lambda-captureopt]

Lambda digitalizace

   : výchozí digitalizace

   | sběr dat seznamu

   | Výchozí sběr,sběr dat seznamu

Výchozí digitalizace

   : &

   | =

sběr dat seznamu

   : sběr

   | sběr dat seznamu,sběr

sběr dat

   : identifikátor

   | &identifikátor

   | this

deklarace parametru lambda

   : (lambda parametr prohlášení seznamopt) proměnlivých specifikaceopt výjimku specifikaceopt lambda vrátit typ klauzuleopt

Lambda parametr prohlášení seznam

   : parametr lambda

   | Parametr lambda,lambda parametr prohlášení seznam

Parametr lambda

   : declarator decl specifikátor SEQ.

Lambda vrátit typ klauzule

   : ->type-id

Následující část popisuje, jak gramatiky se týká například v úvodu.

Vlastnosti Lambda výrazů

Na následujícím obrázku je příklad mapuje gramatiky.

Konstrukční prvky pro lambda výrazy

Popisky na obrázku jsou následující:

  1. Představení lambda (dále jako zachycení klauzule dále v tomto tématu)

  2. Lambda parametr prohlášení seznam (dále jako seznam parametrů dále v tomto tématu)

  3. proměnlivých specifikace (dále jako proměnlivých specifikace dále v tomto tématu)

  4. specifikace výjimku (dále jako specifikaci výjimky dále v tomto tématu)

  5. Lambda vrátit typ klauzule (dále jako vracet typ dále v tomto tématu)

  6. prohlášení krmných (dále jako lambda subjektu dále v tomto tématu)

Následující oddíly popisují gramatiky podrobněji.

Dd293603.collapse_all(cs-cz,VS.110).gifZachycení klauzule

Lambda výraz přístup všechny proměnné, která má dobu trvání automatického ukládání a je přístupný v ohraničujícím oboru.Klauzule digitalizace určuje, zda subjekt lambda výraz přistupuje k proměnné v ohraničujícím oboru hodnotou nebo odkazem: proměnné, které mají ampersand (&) předpona přistupuje odkaz a proměnných, které nemají & hodnotu předpony přístupu.Klauzule prázdné sběr [], označuje, že subjekt lambda výraz přistupuje k žádné proměnné v ohraničujícím oboru.

Výchozí režim digitalizace Určuje, zda jsou proměnné sběru explicitně nezadáte zachyceny hodnotou nebo odkazem.Můžete určit výchozí režim digitalizace (capture-default v syntaxi) zadáním & nebo = jako první prvek klauzule digitalizace.& Prvek určuje, že subjekt lambda výraz přistupuje všech sebraných proměnné odkaz neurčíte výslovně jinak.= Prvek určuje, že subjekt lambda výraz přistupuje všech sebraných proměnné hodnotu neurčíte výslovně jinak.Například subjekt lambda výraz přistupuje k externí proměnné total reference a externí proměnné factor hodnotou, pak následující klauzule sběr dat jsou rovnocenné:

[&total, factor]
[&, factor]
[=, &total]

Lambda výrazy v těle metody třídy můžete použít.Předat this ukazatel na sběr klauzule poskytnout přístup členům ohraničující třídy metody a data.Příklad lambda výraz pomocí metody třídy, viz Příklad: v metodě v tématu Použití Lambda výraz Příklady výrazů Lambda.

Dd293603.collapse_all(cs-cz,VS.110).gifSeznam parametrů

Seznam parametrů pro lambda výraz podobný seznam parametrů pro funkci, s následujícími výjimkami:

  • Seznam parametrů nemůže mít výchozí argumenty.

  • Seznam parametrů nemůže mít seznam argumentů proměnné délky.

  • Seznam parametrů nelze nepojmenované parametry.

Lambda výraz můžete provést další lambda výraz jako svůj argument.Další informace naleznete v tématu vyšší pořadí Lambda výrazy Příklady výrazů Lambda.

Seznam parametrů pro lambda výraz je volitelné.Seznam parametrů lze vynechat, pokud neprojde lambda výraz argumenty a nezadáte mutable-specification, exception-specification, a lambda-return-type-clause prvky.Následující příklad ukazuje lambda výraz, který vynechá seznam parametrů:

// lambda_parameter_list.cpp
int main()
{
   int x = 4;
   int y = 5;
   int z = [=] { return x + y; }();
}

Dd293603.collapse_all(cs-cz,VS.110).gifSpecifikace proměnlivých

Součástí specifikace proměnlivých umožňuje subjektu lambda výraz proměnné, které jsou zachyceny hodnotu změnit.V předchozím příkladu mutable klíčové slovo tak, aby subjekt lambda výraz můžete upravit jeho kopie externí proměnné x a y, která zachycuje lambda výraz hodnotou.Protože lambda výraz zachycuje proměnné x a y hodnotu jejich hodnoty zůstávají 1 po volání generate_n.

Dd293603.collapse_all(cs-cz,VS.110).gifSpecifikaci výjimky

Můžete použít throw() specifikaci výjimky označíte, že lambda výraz není vyvoláním výjimky.Jako s běžné funkce Visual C++ Kompilátor generuje varování C4297 Pokud deklaruje lambda výraz throw() specifikaci výjimky a subjekt lambda výjimku, jak je znázorněno v následujícím příkladu:

// throw_lambda_expression.cpp
int main() // C4297 expected
{
   []() throw() { throw 5; }();
}

Další informace o výjimce specifikace viz Specifikace výjimky.

Dd293603.collapse_all(cs-cz,VS.110).gifNávratový typ

Část lambda výraz pro návratový typ následujícímu návratový typ součást běžné metody nebo funkce.Však návratový typ následuje seznam parametrů a musí obsahovat -> před návratového typu.

Část lambda výraz pro návratový typ můžete vynechat, pokud subjekt lambda obsahuje jediný příkaz return nebo lambda výraz nevrací hodnotu.Pokud subjekt lambda tvoří jediný příkaz return, kompilátor deduces návratový typ typu vrácené výraz.V opačném případě kompilátor deduces návratový typ void.

Lambda výraz může způsobit další lambda výraz jako hodnoty.Další informace naleznete v tématu vyšší pořadí Lambda výrazy Příklady výrazů Lambda.

Dd293603.collapse_all(cs-cz,VS.110).gifLambda subjektu

Části těla lambda lambda výraz může obsahovat cokoli, obsahující subjekt běžné metody nebo funkce.Běžné funkce a lambda výraz přístup následující typy proměnných:

  • Parametry

  • Místně deklarované proměnné

  • Datové členy třídy (při deklarované uvnitř třídy)

  • Všechny proměnné s trvání statické úložiště (například globální proměnné)

Kromě toho přístup lambda výraz proměnné, které zachytí z vnějšího oboru.Proměnná je explicitně sebraných v klauzuli sběr lambda výraz.Jinak je proměnná implicitně sebraných.Subjekt lambda výraz používá výchozí režim digitalizace k přístupu proměnné, které jsou zachyceny implicitně.

lambda_parameter_list.cpp Příklad implicitně zachycuje místní proměnné x a y hodnotou.Následující příklad obsahuje lambda výraz, který zachycuje explicitně proměnné n hodnotu a implicitně zachycuje proměnné m odkazem:

// captures_lambda_expression.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

int main()
{
   int m = 0, n = 0;
   [&, n] (int a) mutable { m = ++n + a; }(4);
   cout << m << endl << n << endl;
}

Tento příklad vytiskne následující ke konzole:

5
0

Protože proměnná n je hodnota jeho hodnota zůstává zachycených 0 po volání lambda výraz.

Přestože lambda výraz můžete sbírat pouze proměnné, jejichž doba trvání automatického ukládání, můžete používat proměnné, jejichž doba trvání statické úložiště v těle lambda výraz.V následujícím příkladu generate funkci a lambda výraz přiřadit hodnotu pro každý prvek vector objektu.Lambda výraz upravuje statickou proměnnou generování hodnoty další prvek.

// lambda_static_variable.cpp
// compile with: /c /EHsc
#include <vector>
#include <algorithm>
using namespace std;

void fillVector(vector<int>& v)
{
   // A local static variable.
   static int nextValue = 1;

   // The lambda expression that appears in the following call to
   // the generate function modifies and uses the local static 
   // variable nextValue.
   generate(v.begin(), v.end(), [] { return nextValue++; });
}

Další informace o generate fungovat, viz generate.

Viz také

Referenční dokumentace

Lambda výrazy v jazyce C++

Příklady výrazů Lambda

generate

generate_n

for_each

Specifikace výjimky

C4297 (úroveň 1) upozornění kompilátoru