Lambdas genéricas e encerramentos no C++14
Escreva lambdas genéricas com parâmetros auto e raciocine sobre os tipos de encerramento
Lambdas genéricas e encerramentos no C++14 é 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.
Lambdas genéricas
C++14 permite escrever auto na lista de parâmetros de uma lambda. O compilador gera um operator() parametrizado por modelo — a lambda aceita qualquer tipo.
auto print = [](const auto& x) {
std::cout << x << "\n";
};
print(42);
print("hello");
print(3.14);Como elas funcionam
A lambda se transforma em uma classe com um operator() parametrizado por modelo. Cada combinação exclusiva de tipos instancia uma função separada internamente.
Casos de uso
As lambdas genéricas são especialmente úteis em algoritmos que funcionam com vários tipos.
std::vector<int> ints = {1, 2, 3};
std::vector<std::string> strs = {"a", "b"};
auto printAll = [](const auto& container) {
for (const auto& x : container) std::cout << x << " ";
};
printAll(ints);
printAll(strs);Vários parâmetros auto
Cada auto é independente — parâmetros diferentes podem ser resolvidos para tipos diferentes.
auto add = [](auto a, auto b) {
return a + b;
};
std::cout << add(1, 2.5); // 3.5
std::cout << add(std::string("Hi"), "!"); // Hi!Fechamentos são objetos
Cada expressão lambda cria um fechamento — uma instância de uma classe exclusiva gerada pelo compilador. O fechamento armazena como membros todas as variáveis capturadas.
Um tipo exclusivo para cada lambda
Cada expressão lambda tem um tipo exclusivo, mesmo que duas tenham texto idêntico. Não é possível escrever o nome do tipo diretamente — use auto ou std::function.
Armazenando lambdas em std::function
Para manter uma lambda em uma variável cujo tipo seja conhecido, envolva-a em std::function. Isso adiciona uma pequena sobrecarga, mas permite o polimorfismo em tempo de execução entre entidades chamáveis.
#include <functional>
std::function<int(int)> doubler = [](int x) { return x * 2; };Custo do apagamento de tipo
std::function usa apagamento de tipo — pode armazenar qualquer entidade chamável compatível, mas adiciona uma alocação na memória dinâmica e uma chamada virtual. Evite-o em laços críticos.
Quando auto é suficiente
Para lambdas de curta duração (passadas a algoritmos e armazenadas em auto), não é necessário apagar o tipo e não há sobrecarga.
Retornando lambdas
Use auto como tipo de retorno para retornar uma lambda. Cada chamada cria um novo fechamento.
auto makeAdder(int n) {
return [n](int x) { return x + n; };
}
auto add5 = makeAdder(5);
std::cout << add5(10); // 15Funções de ordem superior
As lambdas tornam o C++ um ambiente confortável para funções de ordem superior — funções que recebem ou retornam outras funções.
Verificação rápida
O que significa auto na lista de parâmetros de uma lambda do C++14?
Recapitulação
As lambdas genéricas do C++14 usam parâmetros auto para obter polimorfismo em tempo de compilação. Cada lambda é um tipo de fechamento exclusivo — use auto para armazená-las ou std::function quando o apagamento de tipo for necessário.
Perguntas Frequentes
A aula “Lambdas genéricas e encerramentos no C++14” é grátis?
Sim — o texto completo de “Lambdas genéricas e encerramentos no C++14” é 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 “Lambdas genéricas e encerramentos no C++14”?
Escreva lambdas genéricas com parâmetros auto e raciocine sobre os tipos de encerramento 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 “Lambdas genéricas e encerramentos no C++14”?
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
- Objetos de função e funtores
- Capturas de lambdas por valor, por referência e mutable
- Lambdas genéricas e encerramentos no C++14
- std::function: objetos chamáveis com apagamento de tipo