web-dev-qa-db-fra.com

Les lambdas c ++ 11 capturent-ils les variables qu'ils n'utilisent pas?

Lorsque j'utilise [=] pour indiquer que je voudrais que toutes les variables locales soient capturées par valeur dans un lambda, cela se traduira-t-il par toutes les variables locales dans la fonction en cours de copie, ou juste toutes les variables locales que sont utilisés par le lambda?

Ainsi, par exemple, si j'ai:

vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });

Est-ce que my_huge_vector sera copié, même si je ne l'utilise pas dans le lambda?

117
HighCommander4

Chaque variable nommée expressément dans la liste de capture est capturée. La capture par défaut ne capturera que les variables qui sont à la fois (a) non expressément nommées dans la liste de capture et (b) tilisé dans le corps de l'expression lambda. Si une variable n'est pas nommée expressément et que vous n'utilisez pas la variable dans l'expression lambda, la variable n'est pas capturée. Dans votre exemple, my_huge_vector n'est pas capturé.

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

Si une expression-lambda est associée à capture-default et son instruction composéeodr-usesthis ou une variable avec une durée de stockage automatique et l'entité odr-used n'est pas explicitement capturée, alors l'entité odr-used est censée être implicitement capturée.

Votre expression lambda a un défaut de capture associé: par défaut, vous capturez les variables par valeur en utilisant le [=].

Si et seulement si une variable est utilisée (au sens de la règle de définition unique du terme "utilisé"), une variable est implicitement capturée. Puisque vous n'utilisez pas my_huge_vector du tout dans le corps (la "déclaration composée") de l'expression lambda, elle n'est pas implicitement capturée.

Continuer avec §5.1.2/14

Une entité est capturée par copie si

  • il est implicitement capturé et le capture-default est = ou si
  • il est explicitement capturé avec une capture qui n'inclut pas de &.

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

110
James McNellis

Non, my_huge_vector ne sera pas capturé. [=] signifie que toutes les variables tilisées sont capturées dans le lambda.

15
Thomas Minor