因为 std::function
是可复制的,所以标准要求用于构造它的callables也是可复制的:
n337(20.8.11.2.1)
template <class F> function(F f);要求:F应为CopyConstructible . 对于参数类型ArgTypes和返回类型R,f应为Callable(20.8.11.2).A的复制构造函数和析构函数不应抛出异常 .
这意味着无法从不可复制的绑定对象或捕获仅移动类型(如 std::unique_ptr
)的lambda形成 std::function
.
似乎可以为仅移动的callables实现这样一个仅移动的包装器 . 是否有一个标准的库只移动等效于 std::function
,或者,这个问题有一个共同的解决方法吗?
2 回答
不,C
std
库中没有std::function
的仅移动版本 . (截至C 14)Fastest possible delegates是类似于
std::function
类的实现,碰巧比许多std
库中的大多数std::function
实现更快,并且应该很容易分成move
和copy
版本 .将
move
唯一函数对象包含到具有转发operator()
的类中的shared_ptr<F>
是另一种方法 .这是一个
task
草图:但它还没有经过测试或编译,我只是写了它 .
更具工业强度的版本将包括一个小缓冲区优化(SBO)来存储小的可调用(假设它们是可移动的;如果不是可移动的,则存储在堆上以允许移动),以及一个get-pointer-if-you-the-the- type-right(如
std::function
) .正如其他人所指出的那样,库中没有
std::function
的只移动版本 . 以下是一种解决方法:重用(滥用?)std::function
并允许它接受仅移动类型 . 它在很大程度上受到评论中的dyp's implementation的启发,所以很多功劳归功于他:Working version to coliru .