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 &t) { return t; } template<typename T> T move(T &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!