C++11中通过左值调用函数与通过右值调用函数,实参与形参的类型必须匹配
#include <iostream>
using namespace std;
void p1(int &d) //通过左值引用调用函数
{
cout<<"l_ref d="<<d<<endl;
}
void p2(int &&d) //通过右值引用调用函数
{
cout<<"r_ref d="<<d<<endl;
}
int main(){
int a = 1;
p1(a); //a是左值,与函数p1的左值引用参数匹配
p2(2); //2是右值,与函数p2的右值引用参数匹配
p2(a); //a是左值,与函数p2的右值引用参数不匹配,无法编译
return 0;
}
运行函数输出:
l_ref d=1
r_ref d=2
可以看的出来,左值实参与左值引用形参匹配,右值实参与右值引用参数匹配。
C++11对模板的推导做了引用折叠的特殊处理:
#include <iostream>
using namespace std;
template<class T>
void pd(T&& d)
{
cout<<"d="<<d<<endl;
}
int main(){
int a = 1;
pd(a); //通过左值调用模板函数,模板参数类型T被推导为左值引用int&类型
pd(2); //通过右值调用模板函数,模板参数类型T