0Pricing
C++ Academy · Aula

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;   // 2

Captura 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 dangles

Combinando 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 lambda

Capturando 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 dangles

Verificaçã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

  1. Objetos de função e funtores
  2. Capturas de lambdas por valor, por referência e mutable
  3. Lambdas genéricas e encerramentos no C++14
  4. std::function: objetos chamáveis com apagamento de tipo
← Voltar para C++ Academy