Maison  >  Article  >  développement back-end  >  La capture d'une référence par référence en C 11 Lambdas garantit-elle l'accès à la valeur modifiée ?

La capture d'une référence par référence en C 11 Lambdas garantit-elle l'accès à la valeur modifiée ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 22:39:03375parcourir

Does Capturing a Reference by Reference in C  11 Lambdas Guarantee Access to the Modified Value?

Capturer une référence par référence en C 11 Lambdas

La question :

Considérez le extrait de code suivant :

<code class="cpp">#include <functional>
#include <iostream>

std::function<void()> make_function(int&amp; x) {
    return [&amp;]{ std::cout << x << std::endl; };
}

int main() {
    int i = 3;
    auto f = make_function(i);
    i = 5;
    f();
}</code>

Pouvons-nous garantir que ce programme en produira 5 sans rencontrer de comportement indéfini ? Cette question se pose spécifiquement lors de la capture de la variable x par référence ([&]) et concerne la question de savoir si la capture d'une référence à une variable entraînera une référence suspendue une fois la fonction make_function renvoyée.

La réponse :

Oui, le code est garanti de fonctionner.

Explication :

La spécification lambda C 11 indique que la référence capturée ici reste valide tant que l'objet initialement référencé existe toujours. Cela signifie que même si le paramètre x dans make_function devient hors de portée après le retour de la fonction, la fermeture lambda conserve toujours une référence valide à l'entier i.

Clarification :

Pour corriger certaines inexactitudes dans les réponses précédentes :

  • "Scope" en C fait référence à une région lexicale statique du code où la recherche de nom non qualifié associe un nom à une déclaration. Elle n'a aucun rapport direct avec la durée de vie.
  • Les règles "Atteindre la portée" pour les lambdas déterminent quand la capture est autorisée en fonction de règles syntaxiques, et non de la durée de vie.

Dans ce cas spécifique, la variable x est dans la portée du lambda et est capturé par référence. Par conséquent, la référence reste valide, et le lambda peut continuer à accéder à la valeur modifiée de i.

Conclusion :

Ce code démontre la capture correcte d'une référence par référence dans un lambda. Il est garanti de produire 5 sans invoquer un comportement indéfini.

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