问题描述
我正在尝试了解 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&&
是指什么?
指的是函数模板的函数参数。 f
和 args...
是参数。它们满足所描述的转发引用的要求(只要模板类型参数没有显式传递,在这种情况下,不会从函数参数中推导出类型)。
为什么函数的传递方式与成员函数的传递方式不同?
因为非静态成员函数有一个隐式实例参数,并且因为它们不会隐式衰减到指向成员函数的指针。
如何将局部变量/向量传递给线程?
取决于上下文。复制通常是最简单的。