0Pricing
C++ Academy · Lección

Capturas lambda por valor, por referencia y mutable

Elija cuidadosamente las cláusulas de captura y comprenda el estado de las lambdas.

Capturas lambda por valor, por referencia y mutable es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

Resumen de las capturas

La cláusula de captura de una lambda enumera las variables del ámbito circundante que puede utilizar. El modo de captura controla cómo se accede a cada variable.

Captura por valor

Los nombres enumerados sin & se copian al crear la lambda. La lambda posee su propia copia.

int n = 5;
auto f = [n]() { return n * 2; };
n = 10;
std::cout << f();   // 10 (captured n was 5)

Captura por referencia

Los nombres con & se almacenan como referencias a la variable externa. Los cambios se propagan en ambas direcciones.

int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc();
std::cout << counter;   // 2

Captura predeterminada: =

[=] captura por valor todo lo que se usa en el cuerpo de la lambda. Es práctico, pero puede resultar sorprendente: solo captura las variables a las que se hace referencia.

int a = 1, b = 2, c = 3;
auto f = [=]() { return a + c; };   // captures a and c (not b)

Captura predeterminada: &

[&] captura por referencia todo lo que se usa. Tenga cuidado: las referencias a variables locales quedan colgantes si la lambda sobrevive al ámbito.

int n = 0;
auto bad = [&]() { return n; };
return bad;        // n dies, lambda dangles

Combinación de modos

Combine capturas predeterminadas y específicas. Enumere variables individuales para anular la captura predeterminada.

int a = 1, b = 2;
auto f = [=, &b]() {     // a by value, b by reference
    return a + b;
};

Lambdas mutables

Las variables capturadas por valor son const dentro de la lambda. Añada mutable para permitir que la lambda modifique su copia capturada.

int n = 5;
auto inc = [n]() mutable {
    ++n;
    return n;
};
inc(); inc();
std::cout << n;   // 5 (outer unchanged)

Capturas de inicialización (C++14)

Capture el resultado de una expresión con un nombre nuevo. Esto permite capturar mediante movimiento y usar valores iniciales 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

Capturar this

Dentro de una función miembro, [this] captura el puntero this; todos los miembros están disponibles dentro de la lambda.

Capturar *this (C++17)

[*this] copia el objeto completo en la lambda. Es útil cuando la lambda sobrevive al objeto original.

Problema: captura por referencia y asincronía

Nunca capture variables locales por referencia en una lambda que se ejecute de forma asíncrona: es probable que las variables locales se destruyan antes de que se ejecute la lambda.

// BUG
int local = 42;
std::async([&local]() { use(local); });   // local dies, lambda dangles

Comprobación rápida

¿Qué modo de captura es correcto para permitir que una lambda conserve la propiedad de un std::unique_ptr del ámbito externo?

Resumen

La captura por valor copia; la captura por referencia crea un alias. Use con cuidado las capturas predeterminadas [=] o [&]. mutable permite modificar las copias capturadas por valor. Las capturas de inicialización (C++14) permiten capturar mediante movimiento.

Preguntas frecuentes

¿La lección «Capturas lambda por valor, por referencia y mutable» es gratis?

Sí — el texto completo de «Capturas lambda por valor, por referencia y mutable» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Capturas lambda por valor, por referencia y mutable»?

Elija cuidadosamente las cláusulas de captura y comprenda el estado de las lambdas. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Capturas lambda por valor, por referencia y mutable»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Objetos función y functors
  2. Capturas lambda por valor, por referencia y mutable
  3. Lambdas genéricas y cierres en C++14
  4. std::function: objetos invocables con borrado de tipos
← Volver a C++ Academy