创建 std::thread 时出现错误 C2280,未在 C++ 中初始化
Error C2280 while creating a std::thread without initialization in C++
我想在我的类/结构中创建一个线程对象,但不想在声明期间立即初始化。英蒂德想以后再做。因此,我按照下面的代码片段做了,我得到了这个编译错误。我该如何解决这个问题?
错误 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 Studio12.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。
调用不同的构造函数。该行调用默认构造函数,默认为移动构造函数,该构造函数被删除或哈哈。这个问题的答案很有启发性:
在此处输入链接说明
- 未在作用域中声明unordered_map
- 错误:未在此范围内声明'reverse'
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 已修改的LinkedList未在文本文件本身中更新
- 错误:"imread"未在此范围内声明
- 未在此作用域中声明的函数和变量 (C++)
- 一元"运算符"未在C++中定义
- 未在函数C++中执行的循环
- 未在此范围内声明错误 'xy'
- QT 插槽未在主线程上调用
- fopen_s 未在 scope(C++:codeblocks ) 中声明
- Socklen_t未在此范围内声明
- 如何确定程序未在 docker 中启动的原因
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 代码未在联机编译器上显示结果
- 重载时未在 C++ 的作用域错误中声明
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- 分支未在 Linux 上采用
- OpenGL 片段着色器未在英特尔 HD 4000 显卡上编译
- 自定义 QML QQuick彩绘项目成员锚点未在 qml 中设置为父级