当我想使用is implicitly deleted because the default definition would be ill-formed
将元素添加到向量时,出现以下代码,产生了container.push_back(tmp);
错误,为什么?
我的代码:
#include <vector>
#include <mutex>
class A {
public:
A(){}
~A(){}
};
class my_t {
private:
bool busy;
bool alive;
std::mutex bmtx;
std::mutex amtx;
public:
my_t(){std::lock_guard<std::mutex>lock(bmtx);busy=false;}
~my_t(){}
A* conn;
void take(void) {std::lock_guard<std::mutex>lock(bmtx);busy=true; }
void give(void) {std::lock_guard<std::mutex>lock(bmtx);busy=false; }
bool busy_get(void) {return busy;}
void set_online(void){ std::lock_guard<std::mutex>lock(amtx); alive=true; }
void set_OFFLINE(void) {std::lock_guard<std::mutex>lock(amtx); alive=false; }
bool alive_get(void) {return alive;}
};
class app {
private:
std::vector<my_t> container;
public:
app();
~app();
};
app::app() {
my_t tmp;
tmp.conn = new A();
if (tmp.conn)
tmp.set_online();
container.push_back(tmp);
}
int main(void) {}
或在Coliru上:https://coliru.stacked-crooked.com/a/11625c77383df80c
答案 0 :(得分:4)
您不能拥有target
对象的向量,因为my_t
类包含my_t
es:
std::mutex
Mutexes have a deleted copy constructor。没有复制构造互斥锁的事情。
由于您的 std::mutex bmtx;
std::mutex amtx;
类也没有副本构造函数,因此也会自动删除my_t
的副本构造函数。
my_t
的值类必须至少具有a copy constructor and an assign operator。这是因为向量必须能够重新分配其内容,以适应其增长。这意味着向量中的元素必须是可复制/可分配的。
如果您为std::vector
类显式实现了一个复制构造函数和一个赋值运算符,则可以从中创建一个向量。但是随后您将需要弄清楚将复制构造并分配给my_t
类的含义……
对于您的类,您可以做的最大事情就是拥有一个指向my_t
实例的指针向量。也许使用my_t
或std::unique_ptr
。
答案 1 :(得分:3)
在这一行:
container.push_back(tmp);
您尝试复制一个my_t
对象。这将调用(默认,由编译器提供)副本构造函数,但是它不存在。它不存在,因为它将一一复制所有成员,并std::mutex
has a delete
d copy constructor.。
互斥体是可复制的,这实际上没有任何意义。它们没有value semantics,只有在与实际值并存时才有意义。
因此,为my_t
创建一个自己的副本构造函数,该副本构造函数将复制它可以复制的所有成员,而默认情况下将构造其他成员。
几乎可以肯定的是,您还想deep copy个conn
成员,并使其也成为std::unique_ptr<A>
,以确保在对象被获取时正确地delete
毁了。