[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.