Имеют ли переменные захвата lambdas c ++ 11, которые они не используют?

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

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

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

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

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

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

Если lambda-выражение имеет связанный с ним захват-значение по умолчанию, а его составной оператор odr – использует this или переменную с продолжительностью автоматического хранения, а объект, использующий odr, явно не захвачен, то объект, использующий odr, считается неявным ,

У вашего lambda-выражения есть связанный захват по умолчанию: по умолчанию вы захватываете переменные по значению с помощью [=] .

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

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

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

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

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

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

  • Каково время жизни выражения lambda C ++?
  • Зачем нужно прикладывать lambda-выражение при поставке в качестве простого параметра делегата
  • Самый быстрый способ удалить повторяющееся значение из списка лямбдой
  • Лямбда-выражения как параметры шаблона classа
  • Java lambdas в 20 раз медленнее анонимных classов
  • Необязательный orElse Необязательный в Java
  • Зачем использовать std :: bind over lambdas в C ++ 14?
  • Construct LambdaExpression для вложенного свойства из строки
  • Явный тип возврата lambda
  • Аннотирование функционального интерфейса выражения Lambda
  • преобразование .net Func в .net Expression <Func >
  • Давайте будем гением компьютера.