我无法找到如何将 std::thread()
与 lambda 一起使用。即,具有可变参数的 lambda 通过转发接收参数。例如:
template<typename... T>
auto foo(T&&... t){
[](T&&... t){}(std::forward<T>(t)...); // (1)
return std::thread( // (2)
[](T&&... t){},
std::forward<T>(t)...
);
}
auto bar(){
int n=1;
foo(1); (A)
foo(n); (B)
}
A.1:编译
A.2:编译
B.1:编译
B.2:不编译
我不明白:
- 为什么
std::thread()
(2) 版本使用 (B) 无法编译而 (A.2) 可以? - 为什么(B.1)和(B.2)之间存在差异
最佳答案
std::thread
不能简单地将其参数通过引用转发给 lambda,因为这意味着两个线程可能在不同步的情况下同时访问参数。因此,std::thread
创建参数的临时拷贝,并将它们传递给 lambda。因为它们是临时的,所以它们是右值。这在 A.2 中有效,因为 lambda 的参数是右值引用(因为 T
是 int
,所以 T&&
是 int&&
)。它在 B.2 中不起作用,因为 lambda 的参数是一个左值引用(因为 T
是 int&
,所以 T&&
是 int&
).正如 max66 所说,您可能想在 lambda 中使用 auto&&...
以便它可以接受传递给它的任何内容。
关于c++ - 使用 lambda 将可变参数转发给线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53299885/