Maison >développement back-end >C++ >Comment puis-je capturer correctement des pointeurs uniques dans les expressions C Lambda ?

Comment puis-je capturer correctement des pointeurs uniques dans les expressions C Lambda ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-21 05:23:10607parcourir

How Can I Correctly Capture Unique Pointers in C   Lambda Expressions?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn