将类Cotaining std ::线程添加到向量

Adding class cotaining std::thread to a vector

本文关键字:向量 添加 线程 std 将类 Cotaining      更新时间:2023-10-16

类声明:

class cA{
private:
  std::thread t;
public:
  cA()=default;
};

其他源文件中的某些地方:

cA *a = new cA();
std::vector<cA> v;
v.push_back(*a);

这会在编译时导致以下错误:

C2280: cA::cA(const cA &)': attempting to reference a deleted function

我认为这可能与std::thread缺少复制构造函数的事实有关,并且向量试图制作cA对象的副本。有人愿意解释吗?

std::thread无法复制,因此编译器无法生成默认的复制构造函数,因为它不知道该如何处理类中的不可复制类型。它将在新副本中的std::thread变量中放置什么?

因为它无法生成复制构造函数,因此已删除,就像您说过

一样
cA(const cA &) = delete;

在您的班级定义中。

这是何时可以和无法创建隐式复制构造函数的规则:

http://en.cppreference.com/w/cpp/language/copy_constructor

与您的情况相关的行是:

T具有无法复制的非静态数据成员(已删除,无法访问或模棱两可的复制构造函数(;

对您的问题的评论也要指出,即使确实编译,您的实际代码也不好。它将泄漏cA对象。此处的正确代码(通过评论修复(:

v.emplace_back();  // since the cA constructor takes no parameters

v.push_back(cA()); 

这些都不需要cA是可复制的,因为它使用了移动构造器。

您也可以尝试

v.push_back(std::move(*a));