[C](P) M -> R { body }(Q)
C = capture specification P = parameter specification M = mutable specification R = return type specification Q = actual call parametersLambda expressions are locally defined functions, also known as anonymous functions. A minimal example could look something like this:
int main()
{
auto f = []() { std::cout << "hello"; };
f();
return 0;
}The lambda can also be invoked as it is defined, on-the-fly:[]() { std::cout << "hello"; }();Here is a lambda that takes an int as argument:auto fn = [](int x) { std::cout << "x = " << x << "\n"; };
fn(123);Side note: I tend to use the terms parameter and argument more or less interchangeably. To make things clear, we should, however, make a distinction between the two:- A parameter is a variable declared in the prototype or declaration of a function.
- The argument is the value that is actually passed to the function.
A return value can be specified, using the trailing return type specification (→ R):
auto fn = [](int x) -> int { return x + 1; };
int n = fn(1);
std::cout << "->" << n << "\n";The auto keyword saves us some work when the compiler is able to infer the type of an expression automatically. Alternatively, we could write:std::tr1::function<int(int)> fn = [](int x) -> int { return x + 1; };In this post, I will continue to examine the capture specification and mutable keyword.