当std:mutex作为类的成员的时候,例如:
class Object {
private:
std::mutex mutex_;
}
cmake编译核心报错:
error: use of deleted function ‘std::mutex::mutex(const std::mutex&)
查了查mutex构造函数:
mutex(const mutex&) = delete;
mutex& operator=(const mutex&) = delete;
这是显示地告诉编译器删除编译器默认生成的拷贝构造和移动构造函数,所以mutex对象不能进行拷贝构造和移动构造。
但是在类中并没有"明显"进行拷贝构造和移动拷贝
试着将std::mutex定义为全局变量,编译通过:
std::mutex g_mutex;
class Object {
public:
lock() {
std::unique_lock<std::mutex>lock(g_mutex);
}
}
又试了试这样,编译通过:
class Object {
public:
Object() {
mutex_ = new std::mutex();
}
lock() {
std::unique_lock<std::mutex>lock(*mutex_);
}
~Objext() {
delete mutex_;
}
private:
std::mutex* mutex_;
}
但是没有找到相关的类类型的类成员内部是如何初始化的,也许可能是先在栈上构造了一个临时对象吧,然后用了移动语义初始化成员mutex_造成的。