我在Visual Studio 2015社区上编译包含以下内容的代码时遇到问题
auto f = async(launch::async,
&WorkerThread<Hash>::run,
WorkerThread<Hash>(mInputFile, mOutputFile),
i, numthreads, mBlockSize);
futures.push_back(std::move(f));
嗯,类似的问题在这里已经问过数十遍了,但是通常问题是std::move
某个地方不存在。
模板类WorkerThread<Hash>
不可复制(已删除复制构造函数和复制赋值运算符),但可移动。上面的代码产生了C2280: "WorkerThread<Hash>::WorkerThread(const WorkerThread<Hash> &)": attempted to reference deleted function
(这是我的翻译)。
似乎默认情况下它没有生成move构造函数,这对我来说很好。当我将它们显式设置为时default
,会遇到相同的错误,但现在它指向std::_Binder<std::_Unforced,_Ty,WorkerThread<Hash>,unsigned int,unsigned int,__int64>::_Binder(const std::_Binder<std::_Unforced,_Ty,WorkerThread<Hash>,unsigned int,unsigned int,__int64> &)
。
任何想法都非常欢迎。
更新:MCVE
如果您有上述编译器,请尝试对其进行编译并报告结果。我认为这可能是我的安装问题。
#include<future>
#include<memory>
class Foo {
public:
Foo() :mData(new int[100]) {}
void run() {}
private:
std::unique_ptr<int[]> mData;
};
int main()
{
auto f = std::async(std::launch::async, &Foo::run, Foo());
f.get();
}
编辑:该错误已在MSVC 2015 Update 2中修复。
这是一个MSVC错误(提示为查找报告的提示@bogdan)。它的async
(和packaged_task
,似乎)实现将函子存储到中std::function
,它不支持仅移动类型-因此无法在符合条件的实现中使用。
一个简单的解决方法是改为使用shared_ptr
:
auto f = async(launch::async,
&WorkerThread<Hash>::run,
std::make_shared<WorkerThread<Hash>>(mInputFile, mOutputFile),
i, numthreads, mBlockSize);
futures.push_back(std::move(f));
[=]{WorkerThread<Hash>(mInputFile, mOutputFile).run(i, numthreads, mBlockSize); }
也可以考虑使用Lambda(沿的行),但这会导致行为发生变化:WorkerThread<Hash>
不再在调用的线程中构造async
,而是在async
生成的线程中构造。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句