如何通过C++ 11 lambda中的move(也称为右值引用)捕获?
我想写这样的东西:
std::unique_ptr<int> myPointer(new int);
std::function<void(void)> example = [std::move(myPointer)]{
*myPointer = 4;
};
Run Code Online (Sandbox Code Playgroud) 我最近在努力寻找一个很难找到的bug.我试图将lambda传递给一个获取std::function对象的函数.lambda正在捕获一个不可复制的对象.
我想通了,显然一些副本必须在所有通行证之间发生.我来到这个结果是因为我总是以error: use of deleted function错误结束.
以下是产生此错误的代码:
void call_func(std::function<void()> func)
{
func();
}
int main()
{
std::fstream fs{"test.txt", std::fstream::out};
auto lam = [fs = std::move(fs)] { const_cast<std::fstream&>(fs).close(); };
call_func(lam);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我通过在std::fstream对象中加载对象来解决这个问题std::shared_ptr.这工作正常,但我认为可能有更性感的方式来做到这一点.
我现在有两个问题:
fstream在for循环中生成了许多对象和lambda ,并且每个fstream都有一个lambda写入它.因此,fstream只能通过lambdas 来访问对象.我想为一些回调逻辑做这个.有没有像我尝试过的lambda那样更漂亮的方式?