班级声明:
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
对象这一事实有关。有人愿意解释吗?
答案 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));