使用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
相关产品推荐
相关产品推荐

