是否可以传递具有捕获的不可复制(移动)值的lambda?

luk*_*k32 0 c++ lambda unique-ptr c++14

我正在尝试创建一个可调用的对象,它基本上有一个绑定的unique_ptr内部.我已经阅读了如何将unique_ptr捕获到lambda表达式中?

但我无法进一步传递lambda.以下代码无法编译,表明unique_ptr正在进行复制.我不太明白为什么要尝试复制unique_ptr.

#include <iostream>
#include <memory>
#include <functional>

using namespace std;

void f(std::function<void(int)> unary) {
    unary(42);
    unary(1337);
}

struct A{
    void woof(int i) {cout<< "woof " << i << "\n";}
};

int main(){
    auto another_unique = make_unique<A>();
    auto bound_p = [ p = move(another_unique) ] (int i) {p->woof(i);};
    bound_p(5);
    f( bound_p ); // does not compute
}
Run Code Online (Sandbox Code Playgroud)

我也尝试在调用中定义lambda内联f,这样它就可以成为一个临时对象了,它可以被移入f.但错误是一样的.

是否可以将这样的对象绑定/包装成callables并传递它们?

我的用例取决于unique_ptr,但我怀疑任何删除副本c'tor的对象都会出现同样的问题.如果我错了,请告诉我或编辑主题不太通用.

Nic*_*las 5

您不能将任何仅限移动类型放入std::function.该类要求类型可复制.

处理此问题的更好方法是创建f一个调用给定参数的模板,而不是使用类型擦除std::function.function应该用于你想要保留仿函数副本的情况,而不是你想要调用它的情况.