move captura em lambdas
Pergunta:
Como implementamos a captura de movimentos, também conhecidos como referências rvalue, em C 11 LDAS? Por exemplo:
std::unique_ptrmyPointer(new int); std::function example = [std::move(myPointer)] { *myPointer = 4; };
Responder:
lambda generalizada captura em c 14
em C 14, captura generalizada de lambda permite a captura de movimentação. Este código agora é válido:
using namespace std; auto u = make_unique(some, parameters); go.run([u = move(u)] { do_something_with(u); });
para mover objetos de um lambda para outra função, faça o lambda mutável:
go.run([u = move(u)] mutable { do_something_with(std::move(u)); });
uma função auxiliar, make_rref, pode facilitar o movimento da captura. Sua implementação é a seguinte:
#incluirum caso de teste para make_rref:
#includeint main () { std :: Único_ptr#include #include template struct rref_impl { rref_impl() = delete; rref_impl(T&& x) : x{std::move(x)} {} rref_impl(rref_impl& other) : x{std::move(other.x)}, isCopied{true} { assert(other.isCopied == false); } rref_impl(rref_impl&& other) : x{std::move(other.x)}, isCopied{std::move(other.isCopied)} { } rref_impl& operator=(rref_impl other) = delete; T& operator&&() { return std::move(x); } private: T x; bool isCopied = false; }; template rref_impl make_rref(T&& x) { return rref_impl {std::move(x)}; }
int main() { std::unique_ptrp{new int(0)}; auto rref = make_rref(std::move(p)); auto lambda = [rref]() mutable -> std::unique_ptr { return rref.move(); }; assert(lambda()); assert(!lambda()); }
Outra solução alternativa é fornecida pela função Capture ():
#incluirA captura é implementada da seguinte Modelo
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