【发布时间】:2019-01-13 19:41:51
【问题描述】:
我正在努力传递一个带有重载运算符 bool 的可调用对象。它还拥有用于数据的 unique_ptr,因此禁用了复制。 我正在尝试将这样的对象传递给另一个构造函数采用 std::function 的对象,我相信这是完全合法的。
查看示例:
#include <functional>
#include <memory>
#include <utility>
using namespace std;
class invoker
{
public:
invoker(function<bool(void)> fnc_):
fnc { move(fnc_) }
{}
~invoker() = default;
private:
function<bool(void)> fnc;
};
class action
{
public:
action() = default;
~action() = default;
action(const action& rhs) = delete;
action& operator=(const action& rhs) = delete;
action(action&& rhs):
data { move(rhs.data)}
{
}
action& operator=(action&& rhs)
{
if (this != &rhs)
{
data = std::move(rhs.data);
}
}
bool operator()()
{
return true;
}
private:
unique_ptr<int> data;
};
int main()
{
auto runner = std::make_unique<invoker>(std::move(action {}));
//unique_ptr<invoker> runner(new invoker(action() ));
return 0;
}
为什么编译器会抱怨?
> /usr/include/c++/5/functional:1710:34: error: use of deleted function
> 'action::action(const action&)'
> __dest._M_access<_Functor*>() =
【问题讨论】:
-
你看到
'action::action(const action&)'这里的函数签名了吗?编译器抱怨您在删除后使用了action类的复制构造函数。
标签: c++ functional-programming c++14 c++17 move-semantics