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