
Envoyé par
nokomprendo
Pour la lambda [...] et je crois qu'il manque un return :
Merci, c'est corrigé.

Envoyé par
nokomprendo
Pour la lambda, personnellement je préfère expliciter la fermeture
Dans le cas général je n'ai pas trop d'avis là dessus. Mais ici on se sert de la lambda comme on aurait pu utiliser std::bind ou un simple foncteur. Plus le code de la lambda sera court plus il sera facile de voir que l'on cherche à transformer un appel de fonction à N arguments en un appel de fonction sans argument. Donc dans ce cas, j'ai une petite préférence à ne pas expliciter la liste de capture ainsi que le type de retour.

Envoyé par
nokomprendo
Par contre, je ne suis pas fan de la lambda ici car il y doit y avoir un (léger) surcoût pour la créer et de plus on ne peut pas spécifier la référence capturée en const (ou du moins, je ne sais pas comment faire). Donc, je préfère vraiment :
1 2 3
|
auto f = std::async(std::launch::deferred, resultatBackward, std::cref(monGraphe) );
// ... |
S'il y a un surcoût dû à la lambda, il faut changer de compilateur. Les lambdas sont forcément inline et devraient être inliné.
J'aime bien la lambda car elle permet de ne pas oublier les std::ref ou std::cref et quelle s'adapte automatiquement si ces "détails" changent.
Oui, on ne peut capturer que par copie ou référence. Mais rien n'empêche d'avoir un code proche de :
std::async(std::launch::deferred, [&]() { return resultatBackward(fonction_qui_prend_un_T_ref_et_qui_retourne_un_T_const_ref(monGraphe)); });
Partager