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

Is it possible to pass a lambda with captured non-copyable (moved) value?

本文关键字:可复制 移动 lambda 值的 是否      更新时间:2023-10-16

我正在尝试创建一个可调用的对象,它本质上有一个绑定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
}

我还尝试在对f的调用中内联定义lambda,以便它是一个临时对象,并且可以移动到f中。但错误是一样的。

是否可以将此类对象绑定/包装到可调用对象中并传递它们?

我的用例取决于unique_ptr,但我怀疑任何带有已删除副本 c'tor 的对象都会表现出同样的问题。如果我错了,请告诉我或编辑主题以不那么笼统。

不能在 std::function 中放置任何仅移动类型。该类要求类型是可复制的。

处理此问题的更好方法是f创建一个将调用给定参数的模板,而不是使用类型擦除的std::functionfunction应该用于您希望保留函子副本的情况,而不是当您只想调用它时。