我这里有一个对象名叫Sample
,它不支持拷贝赋值与拷贝构造
,但是支持转移赋值和转移构造
。
现在我需要创建一个std::function<void()>
函数对象,其中的参数就有Sample
对象,
我的代码是这样写的:
#include <functional>
struct Sample {
Sample(Sample&& p) {
m_pData = p.m_pData;
p.m_pData = nullptr;
};
static Sample Create(void* data) {
return { data };
}
Sample& operator=(Sample&& p)
{
m_pData = p.m_pData;
p.m_pData = nullptr;
return *this;
}
private:
Sample(void* data) { m_pData = data; }
private:
Sample(const Sample&) = delete;
Sample& operator=(const Sample&) = delete;
void* m_pData;
};
void SampleFunction(int i, Sample f)
{
}
int main()
{
Sample s = Sample::Create(nullptr);
std::function<void()> f2 = std::bind(SampleFunction, 0, std::move(s));
return 0;
}
结果编译出错了,错误信息是:
error C2440: “初始化”: 无法从“std::_Binder<std::_Unforced,void (__cdecl &)(int,Sample),int,Sample>”转换为“std::function<void (void)>”
请问这是什么原因?以及怎么改正? 编译环境是 Windows + vs2015 C++14 编译标准
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.