You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::async传参未加std::ref导致引用参数地址不同的问题

问题解答

1. 不使用std::ref时std::async是否会对传入参数做拷贝?

是的。std::async、std::thread、std::bind这类标准库中负责包装可调用对象、处理异步执行的工具,默认都会按值拷贝(或移动)所有传入的实参,存储在自身维护的内部参数列表中,不会直接传递引用。只有显式使用std::ref(或std::cref对应const引用)包装实参时,才会传递引用语义。

2. 即便print函数形参是const int&引用类型,为什么参数地址仍然会变化?

函数形参的引用类型,仅代表调用函数时形参会绑定到传入的实参对象上,但绑定的具体对象是哪一个,由std::async实际传递给函数的参数决定:

  • 不使用std::ref时,std::async内部已经先拷贝生成了一份原变量a的独立副本,调用print函数时,const int& v绑定的是这个内部存储的副本,所以v的地址和原变量a的地址不一致。
  • 使用std::ref(a)时,std::ref返回的std::reference_wrapper<int>类型会被标准库识别为引用语义的包装器,调用print函数时会隐式转换为原变量a的左值引用,v直接绑定到原变量a,因此两者地址完全相同。

内容的提问来源于stack exchange,提问作者Bhavith C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:54:04