HC4*_*ica 120 c++ lambda c++11
当我[=]用来表示我希望所有局部变量都被lambda中的值捕获时,是否会导致被复制的函数中的所有局部变量,或者只是lambda使用的所有局部变量?
所以,例如,如果我有:
vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });
Run Code Online (Sandbox Code Playgroud)
my_huge_vector会被复制,即使我不在lambda中使用它吗?
Jam*_*lis 112
捕获在捕获列表中明确命名的每个变量.默认捕获将仅捕获(a)未在捕获列表中明确命名的变量和(b)在lambda表达式的主体中使用的变量.如果未明确命名变量且您未在lambda表达式中使用该变量,则不会捕获该变量.在您的示例中,my_huge_vector未捕获.
Per C++11§5.1.2[expr.prim.lambda]/11:
如果lambda表达式具有关联的capture-default及其复合语句 odr-uses
this或具有自动存储持续时间的变量并且未明确捕获使用odr的实体,则称该odr使用的实体被隐式捕获.
您的lambda表达式具有关联的捕获默认值:默认情况下,您使用的值按值捕获变量[=].
当且仅当使用变量时(在术语"使用"的单一定义规则意义上)是隐式捕获的变量.由于您根本不在my_huge_vectorlambda表达式的主体("复合语句")中使用它,因此不会隐式捕获它.
继续§5.1.2/ 14
如果是,则通过副本捕获实体
- 它是隐式捕获的,捕获默认值是
=或者如果- 它是使用不包含的捕获显式捕获的
&.
由于my_huge_vector未隐式捕获并且未明确捕获,因此不会通过复制或引用来捕获它.
Tho*_*nor 16
不,my_huge_vector不会被捕获.[=]表示在lambda中捕获所有使用的变量.
| 归档时间: |
|
| 查看次数: |
21936 次 |
| 最近记录: |