Expressões lambda: captura, mutable e genéricas
Escreva lambdas com capturas, semântica mutable e parâmetros genéricos auto
Expressões lambda: captura, mutable e genéricas é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
O que é uma lambda?
Uma lambda é um objeto de função anônimo definido em linha. Use-a onde, de outro modo, você escreveria uma pequena função nomeada ou uma estrutura com operator().
auto square = [](int x) { return x * x; };
std::cout << square(5); // 25Anatomia da sintaxe
Uma lambda tem quatro partes:
[capture]— quais variáveis do escopo ao redor devem ser usadas(parameters)— como uma lista de parâmetros de função-> return_type— opcional, geralmente deduzido{ body }
Captura vazia
[] significa "não capture nada". A lambda acessa apenas variáveis globais e estáticas.
auto add = [](int a, int b) { return a + b; };Captura por valor
Liste as variáveis na cláusula de captura para copiá-las para dentro da lambda.
int n = 5;
auto times = [n](int x) { return x * n; };
n = 10;
std::cout << times(3); // 15 (captured n was 5)Captura por referência
Use o prefixo & para capturar por referência. As alterações feitas dentro da lambda afetam a variável externa.
int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc(); inc();
std::cout << counter; // 3Capturas padrão: [=] e [&]
Capture tudo o que for usado por valor com [=] ou tudo por referência com [&]. Use com cuidado — seja explícito quando puder.
auto f = [=]() { return a + b; }; // copies a, b
auto g = [&]() { return a + b; }; // references a, bLambdas mutáveis
Por padrão, as capturas por valor são const dentro da lambda. Adicione mutable para permitir sua modificação — as alterações afetam apenas a cópia dentro da lambda.
int n = 5;
auto f = [n]() mutable {
n += 1; // OK because of mutable
return n;
};
f(); f(); // returns 6, then 7
std::cout << n; // still 5 in outer scopeDedução do tipo de retorno
O compilador deduz o tipo de retorno a partir do corpo. Torne-o explícito quando necessário.
auto half = [](int x) -> double { return x / 2.0; };Lambdas genéricas (C++14)
Use auto na lista de parâmetros para obter uma lambda genérica que funcione com qualquer tipo.
auto print = [](const auto& x) { std::cout << x << "\n"; };
print(42); // int
print("hello"); // const char*
print(3.14); // doubleLambdas como argumentos de função
Os algoritmos da STL aceitam lambdas como predicados e transformações.
std::vector<int> v = {5, 2, 8, 1};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });Lambdas são objetos de função
Internamente, o compilador gera uma classe com operator(). Você pode armazenar lambdas em std::function ou auto.
Verificação rápida
Dentro de uma lambda [n](int x) { return x * n; }, você pode atribuir a n sem tornar a lambda mutable?
Recapitulação
Lambdas são objetos de função anônimos definidos em linha. Capture por valor ou por referência, marque como mutable para modificar capturas por valor e use parâmetros auto para lambdas genéricas no C++14 ou posterior.
Perguntas Frequentes
A aula “Expressões lambda: captura, mutable e genéricas” é grátis?
Sim — o texto completo de “Expressões lambda: captura, mutable e genéricas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “Expressões lambda: captura, mutable e genéricas”?
Escreva lambdas com capturas, semântica mutable e parâmetros genéricos auto Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Expressões lambda: captura, mutable e genéricas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- auto, decltype e dedução de tipos
- for baseado em intervalos, nullptr e enum class
- Expressões lambda: captura, mutable e genéricas
- Associações estruturadas e if-init no C++17