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& x) { return [&]{ 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!