Lambda functions (seit C++11)
[] |
This page has been machine-translated from the English version of the wiki using Google Translate.
The translation may contain errors and awkward wording. Hover over text to see the original version. You can help to fix errors and improve the translation. For instructions click here. |
Definiert ein Closure: ein unbenanntes (anonymes) Funktions-Literal, welches Variablen ber deren Erstellungskontext hinaus einfangen und "am Leben erhalten" kann.
Syntax
[ capture ] ( params ) mutable exception attribute -> ret { body }
|
(1) | ||||||||
[ capture ] ( params ) -> ret { body }
|
(2) | ||||||||
[ capture ] ( params ) { body }
|
(3) | ||||||||
[ capture ] { body }
|
(4) | ||||||||
1) Vollstndige Deklaration
2) Deklaration eines konstanten Lambdas: die darin eingefangenen Objekte knnen nicht verndert werden.
3) Auslassung des Rckgabetyps: Der Rckgabetyp der Closure wird wie folgt bestimmt:
- Wenn der body aus einer einzigen
return-Anweisung besteht, ist der Rckgabetyp der Typ desreturn-Ausdrucks (nach impliziter rvalue-zu-lvalue-, array-zu-Zeiger- oder Funktion-zu-Zeiger-Konvertierung)
- Ansonsten ist der Rckgabetyp
void
4) Ausgelassene Parameter-Liste: Die Funktion nimmt keine Parameter entgegen, als ob die Parameterliste () lauten wrde
Erklrung
| mutable | - | erlaubt dem body, die durch Kopieren eingefangenen Parameter zu modifizieren und ihre nicht konstanten Membermethoden aufzurufen |
| exception | - | stellt die Exception-Spezifikation oder noexcept-Klausel fr den Closure-Typ bereit |
| attribute | - | stellt die Attributspezifikation fr den Closure-Typ bereit |
| capture | - | spezifiziert, welche Symbole erfasst und fr den Funktionskrper sichtbar gemacht werden.
Eine Liste der Symbole kann wie folgt bergeben werden:
|
| params | - | Die Liste der Parameter, wie in benannten Funktionen |
| ret | - | Der Rckgabetyp. Falls nicht vorhanden, wird er von den return-Statements der Funktion abgeleitet (oder, falls jene nichts zurckgibt, void) |
| body | - | Funktionskrper |
Der Lambda-Ausdruck ist ein prvalue Ausdruck, dessen Wert (bis C++17) und generiert (seit C++17) ein unbenanntes temporres Objekt vom Typ non-union non-aggregate class, auch genannt 'closure type', das im kleinsten Block-geltungsbereich, Klassen-geltungsbereich oder namespace-geltungsbereich deklariert ist das den Lambda-Ausdruck enthlt. Der 'closure type' enthlt die folgenden Elemente:
ClosureType ::Original:ClosureType::The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.operator()
<tbody>
</tbody>You can help to correct and verify the translation. Click here for instructions.
ret operator()(params) const { body } |
(das Schlsselwort mutable wurde nicht verwendet) | |
ret operator()(params) { body } |
(das Schlsselwort mutable verwendet wurde) | |
Executes the body of the lambda-expression, when invoked. When accessing a variable, accesses its captured copy (for the entities captured by copy), or the original object (for the entities captured by reference). Unless the keyword mutable was used in the lamda-expression, the objects that were captured by copy are non-modifiable from inside this operator().
Dangling references
If an entity is captured by reference, implicitly or explicitly, and the function call operator of the closure object is invoked after the entity's lifetime has ended, undefined behavior occurs. The C++ closures do not extend the lifetimes of the captured references.
ClosureType ::Original:ClosureType::The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.operator ret(*)(params)
<tbody>
</tbody>You can help to correct and verify the translation. Click here for instructions.
typedef ret(*F)(params); operator F() const; |
||
This member function is only defined if the capture list of the lambda-expression is empty.
The value returned by this conversion function is a function pointer that, when invoked, has the same effect as invoking the closure object's function call operator directly.
ClosureType ::Original:ClosureType::The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.ClosureType()
<tbody>
</tbody>You can help to correct and verify the translation. Click here for instructions.
ClosureType() = delete; |
||
ClosureType(const ClosureType& ) = default; |
||
ClosureType(ClosureType&& ) = default; |
||
Closure types are not DefaultConstructible. The copy constructor and the move constructor are implicitly-declared and may be implicitly-defined according to the usual rules for implicit kopieren Konstruktoren and bewegen Konstruktoren.
ClosureType ::Original:ClosureType::The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.operator=()
<tbody>
</tbody>You can help to correct and verify the translation. Click here for instructions.
ClosureType& operator=(const ClosureType&) = delete; |
||
Closure types are not CopyAssignable.
ClosureType ::Original:ClosureType::The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.~ClosureType()
<tbody>
</tbody>You can help to correct and verify the translation. Click here for instructions.
~ClosureType() = default; |
||
The destructor is implicitly-declared.
ClosureType ::Original:ClosureType::The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.CapturedParam
<tbody>
</tbody>You can help to correct and verify the translation. Click here for instructions.
T1 a; T2 b; ... |
||
If the lambda-expression captures anything by copy (either implicitly with capture clause [=] or explicitly with a capture that does not include the character &, e.g. [a, b, c]), the closure type includes unnamed non-static data members, declared in unspecified order, that hold copies of all entities that were so captured.
The type of each data member is the type of the corresponding captured entity, except if the entity has reference type (in that case, references to functions are captured as-is, and references to objects are captured as copies of the referenced objects).
For the entities that are captured by reference (with the default capture [&] or when using the character &, e.g. [&a, &b, &c]), it is unspecified if additional data members are declared in the closure type.
| This section is incomplete Reason: scope rules, capture list rules, nested lambdas, implicit capture vs odr use, decltype |
Beispiel
You can help to correct and verify the translation. Click here for instructions.
#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
int main()
{
std::vector<int> c { 1,2,3,4,5,6,7 };
int x = 5;
c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; } ), c.end());
std::cout << "c: ";
for (auto i: c) {
std::cout << i << ' ';
}
std::cout << '\n';
std::function<int (int)> func = [](int i) { return i+4; };
std::cout << "func: " << func(6) << '\n';
}
Output:
c: 5 6 7
func: 10
Siehe auch
| auto Spezifizierer | gibt einen Typ durch einen Ausdruck (C++11) definiert
Original: specifies a type defined by an expression (C++11) The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
(C++11) |
wickelt aufrufbare Objekt eines beliebigen Typs mit dem angegebenen Funktion Call-Signatur Original: wraps callable object of any type with specified function call signature The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (Klassen-Template) |