Каждая переменная, явно указанная в списке захвата, фиксируется. При захвате по умолчанию будут захватываться только те переменные, которые (а) явно не названы в списке захвата и (б) используются в теле лямбда-выражения. Если переменная явно не названа и вы не используете ее в лямбда-выражении, то переменная не фиксируется. В вашем примере my_huge_vector
не фиксируется.
Согласно C ++ 11 §5.1.2 [expr.prim.lambda] / 11:
Если лямбда-выражение имеет связанный захват по умолчанию и его составной оператор odr-uses this
или переменную с автоматической продолжительностью хранения, а объект odr-used не захвачен явно, то считается, что объект odr-used захватывается неявно.
У вашего лямбда-выражения есть связанный захват по умолчанию: по умолчанию вы захватываете переменные по значению с помощью [=]
.
Если и только если используется переменная (в смысле термина «использованный» в соответствии с одним правилом определения), это переменная неявно фиксируется. Поскольку вы вообще не используете my_huge_vector
в теле («составной оператор») лямбда-выражения, оно не фиксируется неявно.
Чтобы продолжить с §5.1.2 / 14
Сущность захватывается копией, если
- он неявно захватывается, а захват по умолчанию -
=
или если
- он явно захватывается с захватом, который не включает
&
.
Поскольку ваш my_huge_vector
объект не фиксируется неявно и не фиксируется явно, он вообще не фиксируется ни копией, ни ссылкой.