传递一个捕获unique_pointer的lambda

时间:2018-04-04 09:34:47

标签: c++ c++14

我正在使用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
}

关于如何做上述事情的任何想法?

1 个答案:

答案 0 :(得分:4)

std::function必须是CopyConstructible和CopyAssignable,这意味着它必须能够复制其目标。不幸的是,由于您的lambda不可复制,因此无法将其存储在std::function

您将不得不求助于另一个可调用类型擦除的实现,该实现与仅可移动对象一起使用。