pour le vector 'a' par exemple, quand j'écris '[&](double & x)', mes valeurs sont modifiées et les changements conservées, alors quand je fais
'[&](double x)' sans la deuxième esperluette, ce n'est pas le cas. Or je pensais que le [&] suffisait pour dire au code de passer des valeurs par référence.
Pourquoi les changements ne sont pas conservés alors que l'on indique entre crochets un passage par référence ?
Cela me fait penser que je n'ai peut-être pas saisi la différence entre ce qu'il y a entre crochets et ce qu'il y a entre parenthèses.
Pourriez-vous m'expliquer avec des exemples à l'appui pour bien capter ?
ce qu'il y'a entre les crochets permets de "capturer" les éléments environnement par reference. Si tu modifies ces éléments dans ta lambda, les modifications seront conservées. La deuxieme esperluette elle, fonctionne comme pour une fonction "traditionnelle".
Quand tu ecris [&](T val), tu passes le std::vector par reference, mais ses elements (qu'il contient) par valeur. Alors que quand tu ecris [&](T &val), tu passes le tableau par reference, ET ses elements par reference.
si je comprends bien ton code et exemple, tu veux dire que dans l'exemple que j'ai donné au-dessus, je peux par exemple utiliser les variables d'environnement b et c dans la fonction lambda de
et que b et c seront transmises par référence, alors que x ne correspond pas à une variables d'environnement , mais à ce qui est dans le for_each de a.begin() à a.end() ?
C'est exactement ça. Grace à la capture, tout ce qui est hors de la lambda elle meme peut être vu comme une variable globale dans un programme "classique" (du point de vue de la lambda). Tu as donc le droit d'utiliser tout ce que tu as capturé comme bon te semble.
La variable 'x' dans ton cas correspond au paramètre dont ta lambda a besoin et non à une variable d'environnement, comme pour une fonction "classique": il n'existe que dans ta lambda. Tu es donc libre de transmettre ce paramètre par reférence ou valeur.
error: expected primary-expression before '<<' token|
Pourtant b est bien capturé .
Quelque chose m'échappe
EDIT : j'ai trouvé : l'étoile devait être avant
- Edité par pseudo-simple 30 août 2018 à 20:53:19
exemple de lambda avec STL
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Eug
Eug