异步不会在Visual Studio 2015中调用move构造函数

维沙库尔

我在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();
}
TC

编辑:该错误已在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

CMAKE不会在Visual Studio中创建INSTALL项目

Visual Studio Code 不会在 JavaScript 中添加函数括号

解决方案探索中的区域选项不会在Visual Studio 2019中显示

更新ParameterSyntaxList不会在Visual Studio中更新代码吗?

引用不会在 Visual Studio 2005 中自动添加

Visual Studio Code不会在PHP Xdebug中的断点处停止

C ++相同的代码永远不会在Visual Studio中编译/运行,有时甚至不会在Qt Creator中运行

SyncFusion SfChart 不会在 iOS 模拟器(白屏)中呈现,但会在 Visual Studio Preview 中显示?

运算符重载会在Visual Studio 2013中编译,但不会在gcc中编译

Visual Studio 2015 C#Intellisense不会在按“”后自动选择上次使用的选项。(时期)

尽管在调试选项中设置了复选框,Visual Studio Debugger不会在NullReferenceException上中断

情节提要不会在Visual Studio(Xamarin)中打开。无法初始化设计器

使用某些数据结构时,C++ 代码不会在 Visual Studio Code 中输出

Android Studio 不会在 PasswordToggleDrawable 中更改颜色

Heroku不会在Visual Studio Code中加载

Visual Studio Code调试不会在断点处停止

Visual Studio 2015中的“无法引用默认构造函数”

Visual Studio 2013(更新3)中的默认Move构造函数

参考或需要其他文件时,Visual Studio 2019中的Node JS应用的Mocha不会在测试资源管理器中显示测试

从Visual Studio启动时,C#ReleaseMutex()不会在控制台应用程序的多个实例中释放互斥量

颤振异步调用不会在initState()中异步运行

不会在Android Studio的RecyclerView.ViewHolder中notifyDataSetChanged()启动init {}吗?

数据不会在Jaspersoft Studio 6.2.2数据集对话框中显示

工具栏不会在Android Studio中显示为操作栏

Android Studio 0.5.7不会在操作栏中显示按钮

异步调用永远不会在Asp.Net MVC中返回

如果用户不会在Android Studio中更新图像,则会在更新详细信息时出错

由于 EditorConfig,Visual Studio 不会在“内部类”之间放置空间

Visual Studio不会在Android模拟器上部署项目