En C 11, la captura de variables en lambdas generalmente se realiza por referencia. Esta referencia permanece viva mientras exista lambda, lo que a veces puede provocar un comportamiento no deseado si la variable capturada se elimina.
En C 14, generalizada Se introdujo la captura lambda, lo que permite la captura de movimientos. Esto permite una manipulación conveniente de tipos de solo movimiento, como punteros únicos.
std::make_unique() .then([u = std::move(u)] { do_something_with(u); });
Antes de C 14, la captura de movimientos se puede emular usando funciones auxiliares:
Este enfoque crea una clase contenedora, rref_impl, que encapsula el valor y gestiona su vida útil.
templateusing rref_impl = ...; auto rref = make_rref(std::move(val)); [rref]() mutable { std::move(rref.get()); };
Sin embargo, capturar rref en una lambda permite copiarlo, lo que puede provocar errores de tiempo de ejecución.
Este método utiliza un función que toma el valor capturado por referencia y devuelve una lambda que llama a la función con el valor capturado como argumento.
templateusing capture_impl = ...; auto lambda = capture(std::move(val), [](auto&& v) { return std::forward (v); });
Esto evita copiar la lambda y garantiza que el valor capturado se mueva al alcance de lambda.
Recuerde, estas soluciones alternativas no son tan elegantes como la captura lambda generalizada en C 14, pero proporciona una forma de emular la captura de movimientos en versiones anteriores del idioma.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3