我正在使用lambda广义捕获将unique_ptr
移动到lambda(https://stackoverflow.com/a/16968463/118958)。我想在其他地方传递这个lambda以设置回调函数,但我不确定如何。
以下是我正在尝试做的一个小例子,无法编译:
void set_callback(std::function<void(void)> cb);
void move_callback(std::function<void(void)> &&cb);
void test() {
auto a_ptr = std::make_unique<int>(10);
auto lambda = [a_ptr = std::move(a_ptr)] () {};
// set_callback(lambda); // I understand why this wouldn't work
move_callback(std::move(lambda)); // but I would expect this to be OK
}
关于如何做上述事情的任何想法?
答案 0 :(得分:4)
std::function
必须是CopyConstructible和CopyAssignable,这意味着它必须能够复制其目标。不幸的是,由于您的lambda不可复制,因此无法将其存储在std::function
。
您将不得不求助于另一个可调用类型擦除的实现,该实现与仅可移动对象一起使用。