#include <functional>
struct MyFoo
{
MyFoo() {}
MyFoo(const MyFoo&) = delete;
MyFoo(MyFoo&&) = default;
MyFoo& operator=(const MyFoo&) = delete;
MyFoo& operator=(MyFoo&&) = default;
void operator()(int) {
}
};
int main(void)
{
std::function<void(int)> foo{MyFoo()};
}
Error C2280 'MyFoo::MyFoo(const MyFoo &)': attempting to reference a deleted function
MyFoo 是一个右值。当需要复制它时,std::function 不应该复制它,而应该移动它。
std::function
always 要求提供的可调用类型是可复制构造的。你使用什么成员函数是无关紧要的。
至于实现原因:为了使
std::function
使用的类型擦除起作用,必须在构造时为给定的可调用类型实例化所有可能可用的功能,因为使用站点无法知道这个特定的可调用类型类型可以在 std::function
实例中使用。并且 std::function
允许复制,因此这是相关的。