【发布时间】:2011-10-30 20:55:13
【问题描述】:
假设我有一个不可复制但可移动的仿函数 s,我如何将它存储在 std::function 中?即,如何编译以下代码? (使用 gcc 4.6)
#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();
}
【问题讨论】:
-
这行不通,因为
s是本地的并且超出范围... -
std::function<>不包含它包装的可调用对象(我假设正是为了避免要求它们是我可移动/可复制的)。 -
如果您重新设计代码并且能够初始化
std::function,这是可能的。例如,这适用于S s; std::function<void()> func(std::ref(s)); func();。但是您还必须使s在func之前不要超出范围,这意味着它在某种意义上必须是全局的。但是如果这是您的问题,您仍然可以在std::function(有限制)中存储一个可移动对象。
标签: c++