将类cotaining std :: thread添加到向量中

时间:2017-06-08 07:12:31

标签: c++ c++11 vector

班级声明:

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对象这一事实有关。有人愿意解释吗?

2 个答案:

答案 0 :(得分:2)

std::thread不可复制,因此编译器无法生成默认的复制构造函数,因为它不知道如何处理类中的uncopyable类型。它会在新副本的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可复制,因为使用了 move 构造函数。

答案 1 :(得分:0)

您也可以尝试

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