Maison  >  Article  >  développement back-end  >  La capture d'une référence par référence dans un C 11 Lambda est-elle sûre ?

La capture d'une référence par référence dans un C 11 Lambda est-elle sûre ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-04 03:50:02276parcourir

 Is Capturing a Reference by Reference in a C  11 Lambda Safe?

Capturer une référence par référence dans un Lambda C 11

En C 11, nous utilisons souvent des lambdas pour capturer des variables du contexte environnant. Mais que se passe-t-il lorsque l’on capture une référence par référence ? Est-il sécuritaire de le faire ?

Détails du problème

Considérez le 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>

Dans ce code, nous avons un lambda qui capture une référence à la variable entière i. Nous modifions ensuite i dans la fonction principale et appelons le lambda. La question est : le lambda produira-t-il 3 ou 5 ?

Réponse basée sur la norme

Le code est garanti pour produire 5, sans invoquer un comportement indéfini.

Explication

Selon la norme C 11 ([expr.prim.lambda]/17), seules les expressions-id faisant référence à des entités capturées par copie sont transformées en accès membre sur le type de fermeture lambda. Les expressions d'identification faisant référence aux entités capturées par référence sont laissées seules et désignent toujours la même entité qu'elles auraient désignée dans la portée englobante.

Cela signifie que la référence x dans le lambda n'est pas modifiée. Il fait toujours référence à la même variable entière i dans la fonction principale. Par conséquent, lorsque nous modifions i dans la fonction principale, le lambda verra toujours la valeur modifiée.

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