将对象传递给 lambda std::thread (C++) 中的函数:尝试使用已删除的函数

Passing object to a function in lambda std::thread (C++): attempt to use a deleted function

我正在尝试做这样的事情:

class A {
  private:
    std::mutex my_mutex;
  public: 
    void A_function(){
        some work with the mutex;
    }
};
void B_function (A a){
     a.A_function();
}

int main () {
     A a;
     std::thread t([&a]{
          B_function(a); // error here
          });
     t.join();
}

但是,我得到这个错误:

error: attempt to use a deleted function « A »
error: attempt to use a deleted function « std::mutex::mutex(const std::mutex&) »

我做错了什么?

std::mutex 是不可复制的,因此,您自然不能复制 A 类型的对象,它具有 std::mutex.

类型的子对象

作为变通方法,您可以通过引用而不是通过复制将参数传递给 B_function

void B_function (A& a)
{
     a.A_function();
}

不知道使用原始对象而不是其副本是否适合您的需要。