我正在尝试std::function从捕获移动的lambda表达式创建一个。请注意,我可以毫无问题地创建一个捕获移动的lambda表达式;只有当我尝试将其包装为时std::function,我才会收到错误消息。
例如:
auto pi = std::make_unique<int>(0);
// no problems here!
auto foo = [q = std::move(pi)] {
*q = 5;
std::cout << *q << std::endl;
};
// All of the attempts below yield:
// "Call to implicitly-deleted copy constructor of '<lambda...."
std::function<void()> bar = foo;
std::function<void()> bar{foo};
std::function<void()> bar{std::move(foo)};
std::function<void()> bar = std::move(foo);
std::function<void()> bar{std::forward<std::function<void()>>(foo)};
std::function<void()> bar = std::forward<std::function<void()>>(foo);
我将解释为什么我要写这样的东西。我写了一个UI库,类似于jQuery的或JavaFX的,允许用户通过传递给处理鼠标/键盘事件std::functions到方法有相似的名字on_mouse_down(),on_mouse_drag(),push_undo_action(),等。
显然,std::function我想传入的参数在理想情况下应使用捕获移动的lambda表达式,否则我需要诉诸在C ++ 11为标准时使用的难看的“ release / acquire-in-lambda”习惯用法:
std::function<void()> baz = [q = pi.release()] {
std::unique_ptr<int> p{q};
*p = 5;
std::cout << *q << std::endl;
};
请注意,baz两次调用将是上述代码中的错误。但是,在我的代码中,此闭包被保证只被调用一次。
顺便说一句,在我的真实代码中,我没有传递std::unique_ptr<int>,而是更有趣的东西。
最后,我正在使用Xcode6-Beta4,它使用以下版本的clang:
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
拉丁的传说
慕妹3242003
心有法竹
相关分类