Ответ 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
не фиксируется неявно и он явно не захвачен, он не записывается вообще, копией или ссылкой.