C++ 引用包装器作为函数参数
C++ reference wrapper as function argument
根据我的理解,reference wrapper 只是对 reference 的包装,没有什么特别之处。但为什么当作为函数参数传递时,它在函数内部被视为引用本身(而不是包装器)?
#include <iostream>
#include <functional>
using namespace std;
void f(int& x){
cout<<"f on int called"<<endl;
}
void f(reference_wrapper<int>& x){
cout<<"f on wrapper called"<<endl;
}
int main(){
int x = 10;
f(ref(x)); // f on int called, why?
reference_wrapper<int> z = ref(x);
f(z); // f on wrapper called, this makes sense though
}
为什么在函数调用中将 ref(x) 视为 x 本身?我遇到这个问题是因为我试图理解 passing data among different threads 时 ref() 的用法。我认为 ref() 是必要的,因此不需要重写任何带有“&”的函数参数以避免线程相互干扰。但是为什么线程可以在不使用 x.get() 的情况下将 ref(x) 视为 x?
f(ref(x)); // f on int called, why?
因为std::reference_wrapper
有一个到存储引用的转换运算符; ref(x)
returns 一个 std::reference_wrapper
,可以隐式转换为 int&
。
void f(reference_wrapper<int>& x)
对非常量进行左值引用,std::ref
returns 按值,即 returns 是一个不能绑定的右值到非常量的左值引用。然后 f(ref(x));
调用第一个重载 f
而不是第二个。如果您将其更改为 void f(reference_wrapper<int> x)
或 void f(const reference_wrapper<int>& x)
,则会调用它。
根据我的理解,reference wrapper 只是对 reference 的包装,没有什么特别之处。但为什么当作为函数参数传递时,它在函数内部被视为引用本身(而不是包装器)?
#include <iostream>
#include <functional>
using namespace std;
void f(int& x){
cout<<"f on int called"<<endl;
}
void f(reference_wrapper<int>& x){
cout<<"f on wrapper called"<<endl;
}
int main(){
int x = 10;
f(ref(x)); // f on int called, why?
reference_wrapper<int> z = ref(x);
f(z); // f on wrapper called, this makes sense though
}
为什么在函数调用中将 ref(x) 视为 x 本身?我遇到这个问题是因为我试图理解 passing data among different threads 时 ref() 的用法。我认为 ref() 是必要的,因此不需要重写任何带有“&”的函数参数以避免线程相互干扰。但是为什么线程可以在不使用 x.get() 的情况下将 ref(x) 视为 x?
f(ref(x)); // f on int called, why?
因为std::reference_wrapper
有一个到存储引用的转换运算符; ref(x)
returns 一个 std::reference_wrapper
,可以隐式转换为 int&
。
void f(reference_wrapper<int>& x)
对非常量进行左值引用,std::ref
returns 按值,即 returns 是一个不能绑定的右值到非常量的左值引用。然后 f(ref(x));
调用第一个重载 f
而不是第二个。如果您将其更改为 void f(reference_wrapper<int> x)
或 void f(const reference_wrapper<int>& x)
,则会调用它。