Aujourd'hui, j'ai rencontré un comportement très peu intuitif (pour moi, au moins) en C++ 11 lambdas. Le code en question est le suivant:Retour d'un lambda capturant une variable locale
Au lieu d'imprimer 5, ceci imprime du charabia. En fait, au moins dans ma version de GCC, si j'active l'indicateur d'optimisation -O2, il imprime en réalité 5. Puisque la sortie dépend du niveau d'optimisation du compilateur, c'est un comportement indéfini. Après un moment, je pense avoir compris ce qui se passe. Quand la fonction sum est appelée, une variable de pile correspondant à l'argument x est mise à 2, alors la fonction sum retourne, et cette variable de pile peut être écrasée par tout ce que le compilateur doit mettre là pour exécuter le code suivant et au moment où le lambda est finalement exécuté, l'endroit où x ne contient plus 2, et le programme ajoute 3 à un entier arbitraire.
Existe-t-il un moyen élégant de faire en C++ en garantissant que la variable est capturée correctement?
Capture par valeur '[=]'. – Galik
Merci! C'était beaucoup plus simple que ce à quoi je m'attendais. –
Juste pour le lecteur, c'est C++ 14, pas C++ 11. La déduction de type des valeurs de retour de la fonction a été ajoutée en C++ 14. – cdhowie