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
Libérer: 2024-11-22 10:54:11
original
279 Les gens l'ont consulté

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(); };
Copier après la connexion

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(); };
}
Copier après la connexion

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);
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal