Em C 11, a captura de variáveis em lambdas geralmente é feita por referência. Esta referência permanece viva enquanto o lambda existir, o que às vezes pode levar a um comportamento não intencional se a variável capturada for movida.
Em C 14, generalizado A captura lambda foi introduzida, permitindo a captura de movimentos. Isso permite a manipulação conveniente de tipos somente de movimentação, como ponteiros exclusivos.
std::make_unique() .then([u = std::move(u)] { do_something_with(u); });
Antes de C 14, a captura de movimento pode ser emulada usando funções auxiliares:
Esta abordagem cria uma classe wrapper, rref_impl, que encapsula o valor e gerencia seu tempo de vida.
templateusing rref_impl = ...; auto rref = make_rref(std::move(val)); [rref]() mutable { std::move(rref.get()); };
No entanto, capturar rref em um lambda permite que ele seja copiado, potencialmente levando a erros de tempo de execução.
Este método usa um função que pega o valor capturado por referência e retorna um lambda que chama a função com o valor capturado como argumento.
templateusing capture_impl = ...; auto lambda = capture(std::move(val), [](auto&& v) { return std::forward (v); });
Isso evita copiar o lambda e garante que o valor capturado seja movido para o escopo do lambda.
Lembre-se, essas soluções alternativas não são tão elegantes quanto a captura lambda generalizada em C 14, mas fornecem uma maneira de emular captura de movimento em versões anteriores da linguagem.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3