122 votes

C ++11 lambdas tiennent compte des variables ils n ' t utiliser ?

Lorsque j’utilise `` pour indiquer que je voudrais que toutes les variables locales pour être captée par valeur dans un lambda, qui aboutira à toutes les variables locales dans la fonction étant copiés, ou juste tous les variables qui sont utilisées par le lambda?

Ainsi, par exemple, si j’ai j’ai :

My_huge_vector va être copié, même si je ne l’utilise dans le lambda ?

113voto

James McNellis Points 193607

Chaque variable expressément nommé dans la liste de capture est capturé. La valeur par défaut capture capturer uniquement les variables qui sont à la fois (un) n'est pas expressément nommé dans la liste de capture et (b) utilisé dans le corps de la lambda expression. Si une variable n'est pas expressément nommé et vous n'avez pas utiliser la variable dans l'expression lambda, alors la variable n'est pas capturé. Dans votre exemple, my_huge_vector n'est pas capturé.

Par C++11 §5.1.2[expr.prim.lambda]/11:

Si une lambda-expression est associée à une capture par défaut et ses composés-déclaration odr-utilise this ou une variable de stockage automatique de la durée et de l' odr-utilisé entité n'est pas explicitement capturé, alors l' odr-utilisé entité est dit implicitement saisis.

Votre expression lambda est associé à une capture par défaut: par défaut, vous capturez des variables par valeur à l'aide de l' [=].

Si et seulement si une variable est utilisée (dans Une Définition de la Règle du sens du terme "utilisé") est une variable implicitement saisis. Puisque vous n'avez pas utiliser my_huge_vector dans le corps (la "composé de déclaration") de l'expression lambda, il n'est pas implicitement saisis.

Pour continuer avec le §5.1.2/14

Une entité est capturé par copie si

  • il est implicitement saisis et la capture par défaut est = ou si
  • il est explicitement capturé avec une capture qui ne comprennent pas d' &.

Depuis votre my_huge_vector n'est pas implicitement capturé et il n'est pas explicitement saisies, il n'est pas capturé, par copie ou par référence.

16voto

Thomas Minor Points 558

Non, ne va pas être photographiée. signifie toutes les variables utilisées sont capturés dans le lambda.

-8voto

n.m. Points 30344

Il n’y a aucune garantie qu’il en soit. Le compilateur est autorisé à copier votre vecteur énorme, même si vous ne demandez pas une copie, juste pour rire. OTOH si il détecte que la valeur n’est pas être utilisée, le compilateur est autorisé à elide la copie, même si explicitement demandée.

Cela dit, seules les variables qui sont utilisées par le lambda sont implicitement capturés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X