这个答案 https://stackoverflow.com/a/20669290/1858225解释了如何在 C++14 中移动捕获 lambda 中的变量。
但是一旦你移动捕获了一个不可复制的对象(例如std::unique_ptr
)在 lambda 中,您无法复制 lambda 本身。
如果可以的话那就太好了movelambda,但在尝试这样做时出现编译错误:
using namespace std;
class HasCallback
{
public:
void setCallback(std::function<void(void)>&& f)
{
callback = move(f);
}
std::function<void(void)> callback;
};
int main()
{
auto uniq = make_unique<std::string>("Blah blah blah");
HasCallback hc;
hc.setCallback(
[uniq = move(uniq)](void)
{
std::cout << *uniq << std::endl;
});
hc.callback();
}
这会产生以下错误g++
(我尝试仅复制相关行):
error: use of deleted function ‘main()::<lambda()>::<lambda>(const main()::<lambda()>&’
...我认为这意味着我移动 lambda 的尝试失败了。
clang++
给出了类似的错误。
我明确尝试过move
ing lambda(即使它是一个临时值),但这没有帮助。
EDIT:下面的答案充分解决了上述代码产生的编译错误。对于替代方法,只需release
将唯一指针的目标值转换为std::shared_ptr
, which can被复制。 (我不是把这个写成答案,因为那会假设这是一个 XY 问题,但根本原因是unique_ptr
不能在转换为 a 的 lambda 中使用std::function
理解这一点很重要。)
EDIT 2:可笑的是,我刚刚意识到auto_ptr
据我所知,实际上会在这里做正确的事情(!)。它的作用本质上就像unique_ptr
,但允许复制构造代替移动构造。