Maison > développement back-end > C++ > 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
Libérer: 2024-11-04 20:50:02
original
446 Les gens l'ont consulté

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

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 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