传递包含互斥体的成员函数时出现模板错误

dan*_*gur 6 c++ templates

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

错误 C2664: 'B::B(const B &)': 无法将参数 1 从 '_Ty' 转换为 'const 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";
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 5

Astd::mutex是不可复制的,它的复制构造函数被删除。复制互斥体没有定义的语义,这意味着什么?如果互斥体锁定了某些内容,是否意味着两个互斥体以某种方式成功锁定了同一个对象(原始对象和副本),并且两者都必须解锁。因此 astd::mutex不可复制。

B也使得不可复制。

std::bind需要使用可复制的可调用对象,这会导致此编译错误。