2017-07-07 79 views
1

我想在我的类/结构中创建一个线程对象,但不希望在声明过程中立即初始化。 Intead希望以后再做。因此,我做了下面的代码片段,我收到了这个编译错误。我该如何解决 ?错误C2280创建std ::线程时未在C++中初始化

错误C2280: '的std ::螺纹::螺纹(常量的std ::螺纹&)':试图 引用一个已删除的功能

我观察到导致该错误的行是:

std::thread t2; 

这是否意味着我们不能只申报一个std ::线程没有初始化?这违背了答案,在这个线程Is it possible to define an std::thread and initialize it later?

struct Abc 
{ 
    int a; 
    std::thread t2; 
    void mem1() 
    { 
     printf("mem1\n"); 
    } 

    void mem2() 
    { 
     printf("mem2\n"); 
     std::thread t1(&Abc::mem1, Abc()); 
     t2.swap(t1); 
     printf("after spawning t1\n"); 
     t2.join(); 
    } 
}; 

错误详细信息:

C:\ Program Files文件(x86)的\微软的Visual Studio 12.0 \ VC \包括\ xmemory0(611) :error C2280:'std :: thread :: thread(const std :: thread &)':尝试引用已删除的函数1>
C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ include \ thread(70):参见'std ::螺纹::线程“1>此诊断发生在编译器生成 功能” ABC ::美国广播公司(美国广播公司常量&)

+0

此代码是可以的。它在这里工作:https://ideone.com/xRjkcv。我认为问题在别的地方。请发布您的程序的其余部分或尝试清理/重建整个事情... –

回答

4

编译器错误是告诉你,你要复制一个struct Abc其中有会员std::thread。这是不可能的,因为std::thread不能被复制。

如果您已经发布了包含首先指向的代码的全部错误消息(即实际调用代码行Abc的复制构造函数),我可以为您提供更完整的解决方案。


旧的答案在下面不停,但我相信这是在定义具体的问题的原因不正确。关于编译器生成的移动构造函数的漫游仍然有效。

你的代码没问题。编译器无法将调用编译为swap,在移动类型的情况下,该调用依赖于所涉及类型的移动构造函数。你的std::thread没有明确定义它,所以在这种情况下一致的编译器会生成它。

Visual Studio 2013不会自动生成移动构造函数。这看起来像是他们可以解决的错误(通过明确定义它们的std::thread实现,以及可能每隔一个std类(模板))。确保你更新你的编译器到VS 2013.5(更新5),看看是否有帮助。

如果这不起作用,请获取更新版本的Visual Studio。在VS 2015中修复了不生成移动构造函数的问题。另外VS 2017已经不在了。后者在标准C++方面要好得多,严格得多,尽管它仍然无法编译大量的“基本”SFINAE。

+0

vs2013.5升级我也看到了同样的问题。我限制不升级到VS2015或VS2017。另外我的代码需要OS是不可知的。如果C++标准允许在没有初始化的情况下声明线程,那么为什么并不是所有的编译器都遵循C++标准。为什么他们有自己的定制? Wil这个工作在linux,mac,android? – codeLover

+0

为什么所有编译器都不遵守标准?那么,大多数人都做得很好,通常是VS会忘记一些细节(或者大部分)。 VS 2013的C++ 11支持不太好。 – rubenvb

+0

因为一个神秘的缺陷是恢复你对编程和标准阅读的热情所需要的。 VS将永远在你身边。显然不是在2017年,但 –

-6

调用另一个构造函数。该行调用默认的构造函数,该构造函数默认为移动构造函数,该构造函数被删除或者其他声音。在这个问题的答案是相当明亮的:

enter link description here

+0

请保持专业/乐于助人 - “大声笑”没有帮助。默认构造函数不会默认移动构造函数。只有链接的答案令人不悦。 – sehe

+0

那么为什么当他调用默认构造函数时抛出该错误?你确定? – user8210143

+0

它调用复制构造函数。这不是默认的构造函数。而且,不,复制构造函数也不会默认移动构造函数,这也不会被删除。真的,请看另一个答案。 – sehe

相关问题