Maison >développement back-end >C++ >Comment puis-je capturer en toute sécurité un pointeur unique dans une expression C Lambda ?

Comment puis-je capturer en toute sécurité un pointeur unique dans une expression C Lambda ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-22 10:54:11348parcourir

How Can I Safely Capture a Unique Pointer in a C   Lambda Expression?

Capturer un Ptr unique dans une expression Lambda en C

En C, lorsqu'il s'agit de pointeurs uniques et de lambdas, capturer la propriété peut être difficile . Une tentative courante consiste à transmettre un std::unique_ptr par référence et à le capturer dans un lambda:

std::function<void()> getAction(std::unique_ptr<MyClass>& psomething);

return [psomething]() { psomething->do_some_thing(); };

Cependant, cette approche ne parvient pas à se compiler en raison de problèmes de durée de vie. Pour résoudre ce problème, C 14 a introduit la capture généralisée lambda, qui permet de spécifier explicitement le transfert de propriété :

std::function<void()> getAction(std::unique_ptr<MyClass> psomething) {
    return [auto psomething = move(psomething)]() { psomething->do_some_thing(); };
}

En utilisant auto psomething = move(psomething), la propriété du pointeur unique est transférée au lambda, éliminant préoccupations à vie.

Cependant, si vous avez des implémentations de déplacement et de copie personnalisées comme indiqué ci-dessous :

template<typename T>
T copy(const T &amp;t) {
    return t;
}

template<typename T>
T move(T &amp;t) {
    return std::move(t);
}

Vous doit être prudent lorsque vous utilisez move pour les références lvalue car cela peut conduire à un comportement indéfini. Par exemple, déplacer un objet temporaire à l’aide de move(A()) doit être évité. Au lieu de cela, il est recommandé de fournir des versions de déplacement et de copie distinctes pour les références lvalue et rvalue.

Par conséquent, lors de la capture d'un pointeur unique dans une expression lambda, la capture généralisée lambda fournit un moyen pratique et explicite de gérer le transfert de propriété, garantissant bonne gestion de la vie.

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