为什么传递给 std::thread 的成员函数与本地函数不同?

问题描述

我正在尝试了解 std::thread 的使用方式。

标题如下所示:

template< class Function,class... Args >
explicit thread( Function&& f,Args&&... args );
  • 如何确定 f 是通用引用还是右值?从我在网上找到的:

“如果 T 被推导出并且变量/参数类型是不合格的 T&& ,那么它只是一个通用引用。”

unqualified T&& 指的是什么? auto 还是 template

  • 如果我有一个函数 foo,我可以像 std::thread(foo) 一样调用它。这是否意味着 foo 被用作左值引用,因为它不符合右值引用的条件?

  • 为什么函数的传递方式与成员函数的传递方式不同?如果 foo 是类的一部分,您将无法像 std::thread(obj.foo) 一样使用它 - 而是 std::thread(&Class::foo,&obj) 起作用。它背后的逻辑推理是什么?

  • 如何将局部变量/向量传递给线程?我尝试了以下操作,但在函数本身中,即使 vector.size() 输出正确,我也无法访问任何向量元素。

void Class::foo(vector<int>v)
{
   std::cout<<v[0]; // prints nothing
}

int main(void)
{
    std::vector<int>v = {12,3};

    Class obj;

    std::thread t1(&Class::foo,&obj,v);

    t1.join();

}

解决方法

不合格的 T&& 是指什么?

指的是函数模板的函数参数。 fargs... 是参数。它们满足所描述的转发引用的要求(只要模板类型参数没有显式传递,在这种情况下,不会从函数参数中推导出类型)。

为什么函数的传递方式与成员函数的传递方式不同?

因为非静态成员函数有一个隐式实例参数,并且因为它们不会隐式衰减到指向成员函数的指针。

如何将局部变量/向量传递给线程?

取决于上下文。复制通常是最简单的。