Захватывают ли лямбды с ++ 11 переменные, которые они не используют? - PullRequest
117 голосов
/ 31 мая 2011

Когда я использую [=], чтобы указать, что я хотел бы, чтобы все локальные переменные были захвачены значением в лямбда-выражении, это приведет к всем локальным переменным в копируемой функции или только ко всем локальным переменные , которые используются лямбда ?

Так, например, если у меня есть:

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

Будет ли скопирован my_huge_vector, хотя я не использую его в лямбде?

Ответы [ 2 ]

110 голосов
/ 31 мая 2011

Каждая переменная, явно названная в списке захвата, фиксируется.Захват по умолчанию захватывает только переменные, которые (а) не имеют явного имени в списке захвата и (b) использовали в теле лямбда-выражения.Если переменная не имеет явного имени и вы не используете переменную в лямбда-выражении, тогда переменная не фиксируется.В вашем примере my_huge_vector не фиксируется.

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

Если a Лямбда-выражение имеет связанный capture-default и его составной-оператор odr-использует this или переменную с автоматическим продолжительностью хранения и odr-used сущность явно не захвачена, тогда говорят, что odr-used сущность считается неявно захваченной.

Ваше лямбда-выражение имеет связанный захватпо умолчанию: по умолчанию вы захватываете переменные по значению, используя [=].

Если и только если используется переменная (в смысле правила «Одно определение» термина «используется»), переменная неявно фиксируется.Поскольку вы не используете my_huge_vector вообще в теле («составной оператор») лямбда-выражения, оно не фиксируется неявно.

Продолжение с §5.1.2 / 14

Объект захватывается копией, если

  • неявно захвачен и capture-default равен = или
  • явно захвачен с захватом, который не включает &.

Поскольку ваш my_huge_vector не захватывается неявным образом и не захватывается явно, он вообще не захватывается ни копией, ни ссылкой.

15 голосов
/ 31 мая 2011

Нет, my_huge_vector не будет захвачено. [=] означает, что все используемые переменные записываются в лямбду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...