gpt4 book ai didi

c++ - 传递线程构造函数的引用以将其绑定(bind)到函数失败?

转载 作者:行者123 更新时间:2023-11-30 03:27:43 25 4
gpt4 key购买 nike

我有一个 void fun(vector<int> & v)我想在实例化线程时将 vector 传递给它 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 错误示例:

In file included from /usr/include/c++/5/thread:39:0, from source_file.cpp:1: /usr/include/c++/5/functional: In instantiation of ‘struct std::_Bind_simple))(std::vector&)>’: /usr/include/c++/5/thread:137:59: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(std::vector&); _Args = {std::vector

&}]’ source_file.cpp:12:21: required from here /usr/include/c++/5/functional:1505:61: error: no type named ‘type’ in ‘class std::result_of))(std::vector&)>’ typedef typename result_of<_Callable(_Args...)>::type result_type; ^ /usr/include/c++/5/functional:1526:9: error: no type named ‘type’ in ‘class std::result_of))(std::vector&)>’ _M_invoke(_Index_tuple<_Indices...>)

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

最佳答案

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

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

为什么?

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

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

关于c++ - 传递线程构造函数的引用以将其绑定(bind)到函数失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47122849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com