为线程构造函数传递一个引用来将它绑定到函数失败?

时间:2017-11-05 14:45:09

标签: c++ multithreading binding arguments c++14

我有一个void fun(vector<int> & v),我想在实例化一个线程thread t(fun, v);时向它传递一个向量。在C++14 clang 4编译失败时,在MSVC it runs passing a copy中运行。

#include <thread>
#include <vector>
#include <iostream>
using namespace std;

void fun(vector<int> & v) {
    v.push_back(13);
}

int main(){
    vector<int> v;
    thread t(fun, v);
    t.join();
    cout << v.size();
}

gcc 5.4.0错误的例子:

  

在/ usr / include / c ++ / 5 / thread:39:0中包含的文件中,                    from source_file.cpp:1:/ usr / include / c ++ / 5 / functional:在'struct。的实例化中   的std :: _ Bind_simple))(标准::矢量&安培;)&GT;”:   / usr / include / c ++ / 5 / thread:137:59:需要   'std :: thread :: thread(_Callable&amp;&amp;,_Args&amp;&amp; ...)[with _Callable = void   (安培)(标准::矢量&安培); _Args = {std :: vector

     
    

&amp;}]'source_file.cpp:12:21:从这里需要/ usr / include / c ++ / 5 / functional:1505:61:错误:没有名为'type'的类型     'class std :: result_of))(std :: vector&amp;)&gt;'            typedef typename result_of&lt; _Callable(_ Args ...)&gt; :: type result_type;                                                                  ^ / usr / include / c ++ / 5 / functional:1526:9:错误:没有名为'type'的类型     'class std :: result_of))(std :: vector&amp;)&gt;'              _M_invoke(_Index_tuple&LT; _Indices ...&GT)

  

所以1)c ++标准在这个问题上的立场是什么; 2)有没有办法解决它(不是passing a pointer而不是+1额外lambda expression as wrapper)?

1 个答案:

答案 0 :(得分:2)

正如评论中Galik指出的那样,您只需要std::ref()

thread t(fun, std::ref(v));

为什么?

这是因为您的函数fun()需要引用左值。但是,在构造thread()时,将在新线程中传递参数的副本。不幸的是,在这种情况下,编译器将无法通过引用临时副本来实例化场景后面的模板。

放置std::ref()将导致使用对原始文件的引用,并使整个过程按预期工作。