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

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

Итак, например, если я:

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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