因为 std::function
是可复制的,所以标准要求用于构造它的可调用对象也是可复制的:
n337 (20.8.11.2.1)
template<class F> function(F f);
要求:
F
应为 CopyConstructible。f
对于参数类型ArgTypes
和返回类型R
应该是可调用的(20.8.11.2)。 A 的复制构造函数和析构函数不应抛出异常。
这意味着不可能从不可复制的绑定对象或捕获诸如 --- 的仅移动类型的 lambda 形成 std::function
std::unique_ptr
。
似乎可以为只移动的可调用对象实现这样的只移动包装器。是否有 std::function
的标准库仅移动等效项,或者,是否有解决此问题的常见解决方法?
原文由 orm 发布,翻译遵循 CC BY-SA 4.0 许可协议
不,在 C++
std
库中没有std::function
的仅移动版本。 (从 C++14 开始)最快的委托 是一个
std::function
类的实现,它恰好比大多数std::function
在许多std
库中的实现应该很容易,并且进入move
和copy
版本。将您的
move
仅功能对象包装成shared_ptr<F>
在一个具有转发的类中operator()
是另一种方法。这是一个
task
草图:但它没有经过测试或编译,我只是写了它。
更工业化的版本将包括一个小缓冲区优化 (SBO) 来存储小的可调用对象(假设它们是可移动的;如果不可移动,则存储在堆上以允许移动),以及一个 get-pointer-if-you-guess-the-类型正确(如
std::function
)。