C++ 在std::function中存储不可复制但可移动的对象

C++ 在std::function中存储不可复制但可移动的对象,c++,C++,假设我有一个函子s,它是不可复制但可移动的,我如何将它存储在std::function中?i、 如何使下面的代码编译?(使用通用条款4.6) #包括 #包括 结构 { S()=默认值; S(S const&)=删除; S&运算符=(S常量&)=删除; S(S&&{} void运算符()({} }; std::函数func; void make_func() { S S; func=std::bind(std::move(s));//这不会编译 } int main() { make_func()

假设我有一个函子s,它是不可复制但可移动的,我如何将它存储在std::function中?i、 如何使下面的代码编译?(使用通用条款4.6)

#包括
#包括
结构
{
S()=默认值;
S(S const&)=删除;
S&运算符=(S常量&)=删除;
S(S&&{}
void运算符()({}
};
std::函数func;
void make_func()
{
S S;
func=std::bind(std::move(s));//这不会编译
}
int main()
{
make_func();
}

据我所知,标准中的std::function应该是可复制的。因此,你不能直接实现你想要的

不过,我想你可以带上一些定制包装纸。事情会是这样的:

  • 使包装器包含一个到实际函子的
    std::shared_ptr
  • 当从函子右值构造包装器时,将函子移动到动态分配的内存中
  • 包装器和析构函数的复制构造函数仅由
    shared_ptr
    copy-ctor/destructor处理
  • 包装器的
    operator()
    取消对实际函子的智能指针的引用,并将其委托给
    operator()

这不起作用,因为
s
是本地的,超出了范围…
std::function
不包含它所包装的可调用对象(我会精确地假设它们不需要是可移动/可复制的)。如果重新设计代码并能够初始化
std::function
,这是可能的。例如,这可以工作
S;std::function func(std::ref(s));func()。但您还必须使
s
func
之前不超出范围,这意味着它在某种意义上必须是全局的。但如果你有问题的话,你仍然可以在
std::function
(有限制)中存储一个可移动的对象?使用可变模板和参数类型的完美转发来实现这一点。感谢doublep,这满足了我当前的需要。
#include <functional>
#include <iostream>

struct S
{
  S() = default;
  S(S const&) = delete;
  S& operator=(S const&) = delete;
  S(S&&) { }
  void operator()() { }
};

std::function<void()> func;

void make_func()
{
  S s;
  func = std::bind(std::move(s));  // This won't compile
}

int main()
{
  make_func();
}