【发布时间】:2019-03-12 01:16:34
【问题描述】:
当我想用container.push_back(tmp); 将元素添加到向量中时,下面的代码出现is implicitly deleted because the default definition would be ill-formed 错误,这是为什么呢?
我的代码:
#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
【问题讨论】:
-
当您推入
container时,您会尝试复制my_t对象。这将调用(默认的,编译器提供的)复制构造函数,但这不能存在,因为它会复制所有成员和std::mutexhas adeleted copy constructor.。 -
@UlrichEckhardt 老实说,我没有尝试编译它,但看起来它会编译并显示问题。它不是严格意义上的最小化,但也不是太大,只有几个额外的函数,它们是单行的。
-
不是 MCVE,这会让你的问题在这里跑题。这是有充分理由的,请点击提供的链接!
-
旁注:在
my_t类中包含A* conn;表明您应该留意Rules of Three and Five。确保在解决mutex问题后正确复制内容。