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 ?

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 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-04 20:50:02331parcourir

Is Capturing a Reference by Reference in C  11 Lambdas Guaranteed to Output the Updated Value?

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!

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