当我[=]
用来表示我希望所有局部变量都被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中使用它吗?
我不想通过lambda中的值捕获shared_ptr,以确保对象的生命周期延伸到lambda函数被调用的点.
否则我实际上不需要shared_ptr.如果我做:
shared_ptr<..> sp;
sp->async_call( [sp](){} );
Run Code Online (Sandbox Code Playgroud)
即使身体没有引用它,sp仍然可以被复制吗?
假设复制变量具有所需的副作用.我想声明一个复制变量但不使用该变量的lambda.这样做的最低要求是什么?
Copiable copyable;
auto lambda1 = [=](){};
auto lambda2 = [copyable](){};
auto lambda3 = [=](){ copyable; }
auto lambda4 = [=](){ volatile copy = copyable; }
Run Code Online (Sandbox Code Playgroud)
lambda1
使用隐式捕获,并且由于正文没有提及copyable
,我不相信它实际上是复制它.
lambda2
使用显式捕获,似乎根据这个,它应该通过副本捕获.是否允许编译器删除副本?有关此问题的另一个讨论,请参阅此
lambda3
使用隐式捕获,但身体提到copyable
.这是否构成了一种使用方式copyable
?
lambda4
使用隐式捕获并强制另一个volatile
副本.我确信这实际上会有效,但它的副本数量超过了最低限度.
激励案例:我需要在完成任意数量的lambda调用后运行清理,可能在不同的线程中.我可以通过使用一个std::shared_ptr
运行清理的自定义删除器来实现这一点,并以某种方式将其传递给每个lambda.然后,当所有共享ptrs超出范围时,清理将运行.
编辑:lambda3
并且lambda4
错过了=
隐式捕获.