如下代码会报错:error C2280: attempting to reference a deleted function
#include <list>
#include <vector>
#include <memory>
#include <mutex>
#include <string>
class ActionQueue {
private:
std::list<std::shared_ptr<std::string>> ctxQueue;
std::mutex m;
public:
bool is_empty();
void emplace_front(string* ctx_ptr);
std::string& pop_back();
};
int main() {
std::vector<ActionQueue> ctxQueueArray;
return 0;
}
原因如下:
由于std::mutex的拷贝构造函数被禁了:
mutex( const mutex& ) = delete;
导致编译器不会为ActionQueue生成默认的拷贝构造函数,即:
ActionQueue(const ActionQueue& actionQueue) = delete;
而std::vector<ActionQueue>是要求ActionQueue必须包含拷贝构造函数的,所以就报错了。
修改方法也很简单,把 std::mutex m;改成 std::shared_ptr<std::mutex> mPtr;就可以了:
#include <list>
#include <vector>
#include <memory>
#include <mutex>
#include <string>
class ActionQueue {
private:
std::list<std::shared_ptr<std::string>> ctxQueue;
std::shared_ptr<std::mutex> mPtr;
public:
ActionQueue() : mPtr(new std::mutex()) {}
bool is_empty();
void emplace_front(string* ctx_ptr);
std::string& pop_back();
};
由于std::shared_ptr的拷贝构造函数没有被禁用,所以编译器会默认生成ActionQueue(const ActionQueue& actionQueue),这样编译就通过了。
参考文档
https://en.cppreference.com/w/cpp/thread/mutex/mutex
https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr