创建 std::thread 时出现错误 C2280,未在 C++ 中初始化

Error C2280 while creating a std::thread without initialization in C++

本文关键字:未在 C++ 初始化 C2280 thread std 创建 错误      更新时间:2023-10-16

我想在我的类/结构中创建一个线程对象,但不想在声明期间立即初始化。英蒂德想以后再做。因此,我按照下面的代码片段做了,我得到了这个编译错误。我该如何解决这个问题?

错误 C2280:"std::thread::thread(const std::thread &(":正在尝试 引用已删除的函数

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

std::thread t2;

这是否意味着我们不能只声明一个 std::thread 而不初始化?这与该线程中的答案相矛盾 是否可以定义一个 std::thread 并在以后初始化它?

struct Abc
{
int a;
std::thread t2;
void mem1()
{
printf("mem1n");
}
void mem2()
{
printf("mem2n");
std::thread t1(&Abc::mem1, Abc());
t2.swap(t1);
printf("after spawning t1n");
t2.join();
}
};

错误详细信息:

C:\Program Files (x86(\Microsoft Visual Studio

12.0\VC\include\xmemory0(611(: 错误 C2280: 'std::thread::thread(const std::thread &(' : 尝试引用已删除的函数 1>
C:\Program Files (x86(\Microsoft Visual Studio 12.0\VC\include\thread(70(:参见 'std::thread::thread' 的声明 1>此诊断发生在生成的编译器中 函数 'Abc::Abc(const Abc &(

编译器错误告诉您正在尝试复制具有成员std::thread的结构Abc。这是不可能的,因为std::thread无法复制。

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


旧的答案保留在下面,但我认为在定义您的特定问题的原因时是不正确的。关于编译器生成的移动构造函数的漫无边际本身仍然有效。

你的代码很好。编译器无法编译对swap的调用,在仅移动类型的情况下,这依赖于所涉及的类型的移动构造函数。您的std::thread不会显式定义它,因此在这种情况下,符合标准的编译器将生成它。

Visual Studio 2013 不会自动生成移动构造函数。这似乎是他们可以解决的错误(通过为他们std::thread实现显式定义它,可能还有其他std类(模板((。确保将编译器更新到 VS 2013.5(更新 5(,看看是否有帮助。

如果这不起作用,请获取较新版本的Visual Studio。在VS 2015中修复了不生成移动构造函数的问题。VS 2017也出来了。当涉及到标准 c++ 时,后者要好得多,也更严格,尽管它仍然无法编译许多"基本"SFINAE。

调用不同的构造函数。该行调用默认构造函数,默认为移动构造函数,该构造函数被删除或哈哈。这个问题的答案很有启发性:

在此处输入链接说明