类声明:
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/