Maison > Article > développement back-end > La capture d'une référence par référence dans C 11 Lambdas est-elle garantie pour générer la valeur mise à jour ?
Capture de références par référence dans C 11 Lambdas
Cet extrait de code démontre la capture d'une référence entière par référence dans une expression lambda :
<code class="cpp">#include <functional> #include <iostream> std::function<void()> make_function(int& x) { return [&]{ std::cout << x << std::endl; }; } int main() { int i = 3; auto f = make_function(i); i = 5; f(); }</code>
Ce code est-il garanti de produire 5 sans invoquer un comportement indéfini ?
Le code est en effet garanti de fonctionner sans invoquer un comportement indéfini. Contrairement à la capture par valeur ([= x]), la capture par référence ([&x]) exploite une exception unique au sein de la norme C qui permet aux références de persister en dehors de leur durée de vie. En effet, les références capturées par les expressions lambda sont implémentées en tant qu'accès membre au type de fermeture lambda.
Considérations sur la portée et la durée de vie
Il est important de noter que les règles de portée atteinte car les lambdas sont purement syntaxiques et ne jouent aucun rôle dans ce scénario. L'entité référencée, x, se trouve dans la portée du lambda et peut être capturée.
Formulation standard
Selon [expr.prim.lambda]/17 du standard C, seules les expressions capturées par copie subissent une transformation en accès membre sur le type de fermeture lambda. Les expressions capturées par référence sont simplement laissées telles quelles et continuent de désigner l'entité d'origine.
De plus, la norme n'aborde pas explicitement la question des références utilisées en dehors de leur durée de vie. Cependant, comme il n'y a aucune pénalité pour l'utilisation d'une référence en dehors de sa durée de vie (à moins qu'elle ne soit référencée à partir de son propre initialiseur ou d'un membre de classe précédent), ce code est autorisé à fonctionner comme prévu.
Conclusion
La capture d'une référence par référence dans un lambda C 11 est garantie de fonctionner comme prévu, en affichant la valeur mise à jour de l'entier référencé sans invoquer un comportement non défini. Ceci est basé sur la définition standard de la capture lambda et sur l'absence établie de sanctions pour l'utilisation de références en dehors de leur durée de vie dans certains contextes spécifiques.
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!