2 qq 33707711 qq_33707711 于 2017.12.27 13:13 提问

C++的线程为什么不能改变引用的参数的值 5C

如下程序的输出为0,不应该是1吗?为什么。如果改成指针的话输出是1.
void fun(int &a)
{
a =1 ;
}
int main()
{
int a =0 ;
std::thread t(fun,a) ;
t.join () ;
cout<<a<<endl ;
return 0 ;
}

6个回答

caozhy
caozhy   Ds   Rxr 2017.12.27 14:55

std::thread t(fun,a);
因为这里的a不是传递的引用,而是值,而fun是thread调用的,所以修改的是thread内的某个变量(它调用前从a拷贝了一份值),不会作用到a。

qq_33707711
qq_33707711 下面一条写错了
23 天之前 回复
qq_33707711
qq_33707711 请注意,这是引用
23 天之前 回复
a349866381
a349866381   2017.12.27 18:05

std::thread 拷贝构造函数将a拷贝给thread对象的一个内部成员了

qq_38833413
qq_38833413   2017.12.27 16:37

这里涉及到的是值传递和引用传递,你传递过去的是一个值,不会影响原变量的值,你得特定声明一下。

qq_33707711
qq_33707711 下面一条写错了
23 天之前 回复
qq_33707711
qq_33707711 请注意,这是引用
23 天之前 回复
JohnedJay
JohnedJay   2018.01.02 22:48

std::thread t(fun,a);
因为这里的a不是传递的引用,而是值,而fun是thread调用的,所以修改的是thread内的某个变量(它调用前从a拷贝了一份值),不会作用到a。

oyljerry
oyljerry   Ds   Rxr 2017.12.27 13:31

需要强制指定传递引用

 std::thread t3(fun, std::ref(a)); // pass by reference
ulvge0
ulvge0   2017.12.27 14:02

如楼上所言。
系统默认应该采用拷贝。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!