Já apresentei algumas das últimas adições do C++11 à linguagem, como expressões regulares. Outra adição útil é o lambda, uma expressão lambda permite que você defina e use funções anônimas em linha (funções com um corpo mas sem um nome). Você pode usar uma expressão lambda em vez de uma função de objeto, evitando a necessidade de criar uma classe separada e uma definição de função. Este é um exemplo útil quando você precisa de uma expressão de uma linha para interagir com muitos dos algoritmos STL.
Expressões lambda estão disponível no g++-4.6.x e no Visual Studio 2010, você não pode usar lambda com llvm e clang.
Vamos criar um simples (e inútil) exemplo de expressão lambda que irá retornar um número:
[]()->int{return 4;}();
Obviamente o código acima não fará nada visível (na verdade, ele retornará um número inteiro), podemos usá-lo para imprimir 4 no terminal:
int result=[]()->int{return 4;}();
cout<<result<<endl;
Um exemplo levemente mais útil que irá receber um número inteiro como entrada e irá retornar duas vezes esse número:
int result=[](int input)->int{return 2*input;}(10);
cout<<result<<endl;
A partir dos exemplos acima, a sintaxe de uma expressão lambda pode ser escrita (esta não é a sintaxe completa de uma expressão lambda):
[](input_paramter_declaration)->returned_type {body_of_the_lambda_expression}(parameters)
Uma expressão lambda que irá adicionar dois números e irá retornar o resultado pode ser escrito como:
int result=[](int a,int b)->int{return a+b;}(2,4);
cout<<result<<endl;
Podemos usar uma expressão lambda dentro de outra expressão lambda. Combinando os exemplos acima, podemos criar um exemplo levemente mais complexo:
int result=[](int m,int n)->int{return m+n;}([](int a)->int{return a;}(2),[](int a)->int{return a;}(3));
cout<<result<<endl;
Se você precisar usar mais de uma expressão lambda, poderia ser chato ter que copiar a mesma parte de código, você pode usar um apontador para a expressão lambda:
auto func=[](int a,int b)->int{return a+b;};
cout<<func(2,3)<<endl;
A auto keyword irá ser responsável por definir func como o apontador para a expressão lambda. Suponha que precisemos classificar um vetor de números inteiros; usando o algoritmo de classificação do C++98, isso pode ser implementado:
#include <iostream>
#include <vector>
#include <algorithm>
bool compare(int i,int j){return (i<j);}
using namespace std;
int main()
{
int n=10;
vector<int>v(n);
//initialize the vector with values from 10 to 1
for(int i=n,j=0;i>=0;i--,j++)v[j]=i;
//print the unsorted vector
for(int i=0;i<n;i++)cout<<v[i]<<" ";cout<<endl;
//sort the vector
sort(v.begin(),v.end(),compare);
//print the sorted vector
for(int i=0;i<n;i++)cout<<v[i]<<" ";cout<<endl;
return(0);
}
Usando uma expressão lambda, podemos conseguir o mesmo resultando evitando declarar uma função de comparação:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n=10;
vector<int>v(n);
//initialize the vector with values from 10 to 1
for(int i=n,j=0;i>=0;i--,j++)v[j]=i;
//print the unsorted vector
for(int i=0;i<n;i++)cout<<v[i]<<" ";cout<<endl;
//sort the vector
sort(v.begin(),v.end(),[](int i,int j)->bool{return (i<j);});
//print the sorted vector
for(int i=0;i<n;i++)cout<<v[i]<<" ";cout<<endl;
return(0);
}
Para aqueles interessados em aprender a nova sintaxe I do C++11, eu recomendo a leitura do Professional C++, de M. Gregoire, N. A. Solter e S. J. Kleper:

?
Texto original disponível em http://solarianprogrammer.com/2011/11/01/cpp-11-lambda-tutorial/








