我有一个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)?
答案 0 :(得分:2)
正如评论中Galik指出的那样,您只需要std::ref()
:
thread t(fun, std::ref(v));
为什么?
这是因为您的函数fun()
需要引用左值。但是,在构造thread()
时,将在新线程中传递参数的副本。不幸的是,在这种情况下,编译器将无法通过引用临时副本来实例化场景后面的模板。
放置std::ref()
将导致使用对原始文件的引用,并使整个过程按预期工作。