我想创造一个
std::function
std::函数
我有一个错误。
例如:
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,允许用户通过传递来处理鼠标/键盘事件
s到具有以下名称的方法
on_mouse_down()
,
on_mouse_drag()
,
push_undo_action()
等等。
很明显
std::函数
我想通过,应该理想地使用一个移动捕捉lambda表达式,否则我需要诉诸于“当我在C++ 11是标准时使用的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