Capturas de lambdas por valor, por referência e mutable
Escolha cuidadosamente as cláusulas de captura e compreenda o estado das lambdas
Capturas de lambdas por valor, por referência e mutable é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 2 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.
Recapitulação das capturas
A cláusula de captura de uma lambda lista as variáveis do escopo ao redor que ela pode usar. O modo de captura controla como cada variável é acessada.
Captura por valor
Os nomes listados sem & são copiados quando a lambda é criada. A lambda mantém a sua própria cópia.
int n = 5;
auto f = [n]() { return n * 2; };
n = 10;
std::cout << f(); // 10 (captured n was 5)Captura por referência
Os nomes com & são armazenados como referências à variável externa. As alterações são propagadas nos dois sentidos.
int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc();
std::cout << counter; // 2Captura padrão: =
[=] captura por valor tudo o que for usado no corpo da lambda. É conveniente, mas pode surpreender — captura somente as variáveis referenciadas.
int a = 1, b = 2, c = 3;
auto f = [=]() { return a + c; }; // captures a and c (not b)Captura padrão: &
[&] captura por referência tudo o que for usado. Tenha cuidado — as referências a variáveis locais ficam pendentes se a lambda sobreviver ao escopo.
int n = 0;
auto bad = [&]() { return n; };
return bad; // n dies, lambda danglesCombinando modos
Combine capturas padrão e específicas. Liste variáveis individuais para substituir o padrão.
int a = 1, b = 2;
auto f = [=, &b]() { // a by value, b by reference
return a + b;
};Lambdas mutáveis
As variáveis capturadas por valor são const dentro da lambda. Adicione mutable para permitir que a lambda modifique a cópia capturada.
int n = 5;
auto inc = [n]() mutable {
++n;
return n;
};
inc(); inc();
std::cout << n; // 5 (outer unchanged)Capturas com inicialização (C++14)
Capture o resultado de uma expressão com um novo nome. Isso permite capturar por movimentação e usar valores iniciais calculados.
auto ptr = std::make_unique<int>(42);
auto f = [p = std::move(ptr)]() {
return *p;
};
// ptr is now empty; p owns the int inside the lambdaCapturando this
[this] captura o ponteiro this — todos os membros ficam acessíveis dentro da lambda.
Capturando *this (C++17)
[*this] copia o objeto inteiro para dentro da lambda. É útil quando a lambda sobrevive ao objeto original.
Armadilha: captura por referência e execução assíncrona
Nunca capture variáveis locais por referência em uma lambda executada de forma assíncrona — é provável que as variáveis locais sejam destruídas antes de a lambda ser executada.
// BUG
int local = 42;
std::async([&local]() { use(local); }); // local dies, lambda danglesVerificação rápida
Qual modo de captura é adequado para permitir que uma lambda mantenha a posse de um std::unique_ptr do escopo externo?
Recapitulação
A captura por valor faz uma cópia; a captura por referência cria um alias. Use os padrões [=] ou [&] com cuidado. mutable permite modificar cópias capturadas por valor. As capturas com inicialização (C++14) permitem capturar por movimentação.
Perguntas Frequentes
A aula “Capturas de lambdas por valor, por referência e mutable” é grátis?
Sim — o texto completo de “Capturas de lambdas por valor, por referência e mutable” é 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 “Capturas de lambdas por valor, por referência e mutable”?
Escolha cuidadosamente as cláusulas de captura e compreenda o estado das lambdas 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 2 de 4.
Quanto tempo leva a aula “Capturas de lambdas por valor, por referência e mutable”?
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