c++ - 使用 lambda 将可变参数转发给线程

标签 c++ multithreading c++14 variadic-templates generic-lambda

我无法找到如何将 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 的参数是右值引用(因为 Tint,所以 T&&int&&)。它在 B.2 中不起作用,因为 lambda 的参数是一个左值引用(因为 Tint&,所以 T&&int&).正如 max66 所说,您可能想在 lambda 中使用 auto&&... 以便它可以接受传递给它的任何内容。

关于c++ - 使用 lambda 将可变参数转发给线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53299885/

相关文章:

c++ - 使用模板化成员函数指针作为模板参数

c++ - "Base class undefined."

c++ - 数组元素的本地拷贝

python - (Python) 在线程中关闭 pygame.display

c++ - clang vs gcc - 空通用 lambda 可变参数包

c++ - 使用不可复制(但可 move )键 move 分配 map 时出错

java - 实现基于 FIX 协议(protocol)的订单,支持止损和获利

C++:正则表达式模式

c++ - 这个语法是什么意思, `class template <class R, class ...Args> class name<R(Args...)>`

android - 如何让用户取消 Android 中的进度通知?