传递包含互斥对象的成员函数时出错



我花了一个小时来整理一个大的类,我需要将其成员函数传递给一个最小的示例。给出的编译错误是:

错误C2664: 'B::B(const B &)':无法从'_Ty'转换参数1to ' st B &'

下面是一个最小的例子,当使用指向互斥对象的指针时,代码编译得很好。有人可以帮助我了解这里出了什么问题,为什么以及如何我可以得到提示,从错误信息在'元组'?谢谢大家!

#include <functional>
#include <iostream>
#include <string>
#include <mutex>

class A  {
public:
std::string Init(std::function<std::string(void)> f) {
return f();
}
};
class B {
std::mutex lock;
std::string member = "Hello World!";
public:
std::string foo() {
return member;
}
};
int main() {
auto callback3 = std::bind(&B::foo, B());
auto instance = A();
std::cout << instance.Init(callback3) << "n";
}

std::mutex是不可复制的,它的复制构造函数被删除。复制互斥锁没有定义的语义,这意味着什么?如果一个互斥锁锁定了某个对象,这是否意味着,不知何故,两个互斥锁设法锁定了同一个对象,原始对象和副本对象,并且都必须被解锁?因此,std::mutex是不可复制的。

这使得B也不可复制。

std::bind需要一个可复制的可调用对象来处理,这导致了这个编译错误。

最新更新