Capturer des pointeurs uniques dans des expressions lambda
Il est courant de rencontrer des difficultés lorsque l'on tente de capturer des pointeurs uniques dans des expressions lambda. Considérez le scénario suivant :
std::function<void()> getAction(std::unique_ptr<MyClass> &&psomething) { // Caller gives ownership of psomething return [psomething]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
Le code ci-dessus ne parvient pas à se compiler en raison de l'incapacité du lambda à capturer le pointeur unique par référence. Pour résoudre ce problème, C 14 a introduit la capture généralisée lambda.
Capture généralisée Lambda en C 14
La capture généralisée Lambda permet de capturer des variables par valeur ou par déplacement. Ceci est réalisé en utilisant la syntaxe = move() lors de la capture du pointeur unique, comme indiqué ci-dessous :
std::function<void()> getAction(std::unique_ptr<MyClass> psomething) { // Caller gives ownership of psomething return [auto psomething = std::move(psomething)]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
En utilisant auto, le lambda déduit automatiquement le type de psomething, qui est un pointeur unique. L'expression = std::move(psomething) déplace explicitement la propriété du pointeur unique dans l'expression lambda.
Implémentation de Move and Copy
L'implémentation de la copie et les fonctions de déplacement fournies dans la question sont valables pour la copie/déplacement en deux phases (comme décrit dans [ce StackOverflow question](https://stackoverflow.com/questions/6322951/whats-the-difference-between-a-copy-constructor-and-a-move-constructor)).
Cependant, il est important à noter que C 11 a introduit une signification différente pour la fonction move via l'expression std::move. L'expression std::move rvalue qualifie l'objet auquel elle est appliquée, indiquant essentiellement qu'il doit être déplacé. Par conséquent, dans le contexte de la capture généralisée lambda, il n'est pas nécessaire d'appeler explicitement std::move sur le pointeur unique ; le lambda déplacera automatiquement la propriété selon les besoins.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!