是否可以传递具有捕获的不可复制(移动)值的 lambda
Is it possible to pass a lambda with captured non-copyable (moved) value?
我正在尝试创建一个可调用的对象,它本质上有一个绑定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::function
。 function
应该用于您希望保留函子副本的情况,而不是当您只想调用它时。
相关文章:
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 简单可复制与可简单复制
- std::元组分配和复制/移动异常保证
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- 在临时将成员带出时省略复制/移动
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 是否可以避免在以下代码中复制/移动构造函数的需要?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 为什么 std::atomic<std::string> 会给出微不足道的可复制错误?
- 我可以隐式地创建一个琐碎的可复制类型吗
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 默认复制/移动构造函数时 GDB 中的奇怪行为
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 防止作用域枚举可复制/可移动
- 使用 std::string 参数和不可移动/可复制参数构建 std::map
- 如何返回一个不可移动(但可复制)的对象
- 为什么代码需要有一个可访问的复制/移动构造函数,即使允许发生复制-省略
- visual C++标准是否要求自己的迭代器是另一个可移动/可复制的
- 类Logger是可复制和可移动的,这有意义吗?