Maison > développement back-end > C++ > le corps du texte

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

Patricia Arquette
Libérer: 2024-11-04 03:50:02
original
328 Les gens l'ont consulté

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

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!

source:php.cn
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