c++ - 将包含 std::thread 的类添加到 vector 中

标签 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 缺少复制构造函数以及 vector 尝试制作 cA 的拷贝有关目的。有谁愿意解释一下吗?

最佳答案

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

因为无法生成复制构造函数,所以被删除,和你说的一样

cA(const cA &) = delete;

在你的类定义中。

以下是何时可以和不能创建隐式复制构造函数的规则:

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

与您的情况相关的行是:

T has non-static data members that cannot be copied (have deleted, inaccessible, or ambiguous copy constructors);

此外,正如对您问题的评论所指出的那样,您的实际代码即使能够编译,也不好。它将泄漏一个cA对象。这里的正确代码(根据评论修复):

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

v.push_back(cA()); 

这些都不需要 cA 是可复制的,因为使用了它的 move 构造函数。

关于c++ - 将包含 std::thread 的类添加到 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44428993/

相关文章:

c++ - 处理需要多行初始化的 'const' 对象

c++ - 在 iPhone 上使用现有的 C++ 引擎

c++ - 将元素插入 std::queue 时避免复制

c++ - 无法链接 GLFW3 : undefined references

c++ - 使用 Rcpp 进行 vector 回收

c++ - C++中new的使用

c++ - 在 C++11 中不推荐使用哪些 C++ 习语?

c++ - 通用 lambda 与标准模板函数(使用什么以及何时使用)

c# - C# 中的矢量投影/拒绝?

vector - Unity3D从V1到移动V2的线性插值