函数参数:右值引用
右值引用
语法:int && a=320+250
&&不是与符号,也不是引用的引用,而是表示右值引用符号,用来指向右值
void add(int &a)
{
std::cout << a;
return 0;
}
int main()
{
int c = 12 + 11;
add(11+11+c);
}
这种方式是错误的,因为引用实际上是指针,而11+11+c没有固定的内存,查看一下c+11+11的内存
int c = 12 + 11;
00C04EAC mov dword ptr [c],17h
add(c+11+11);
00C04EB3 mov eax,dword ptr [c]
00C04EB6 add eax,16h
00C04EB9 push eax
从这里可以看出,第五行表示eax=eax+16h,所以这个11+11+c被放在了寄存器里面
左值和右值的区分
一种说法是等号左边的就是左值,右边的为右值,这种说法大部分情况都适用,另一种说法是有自己固定的内存,能往里面写入数据的称为左值,没有固定内存的,临时找了个内存,不能写入的称为右值,比如11+11+c不能再给它赋值了
举个简单的例子
struct Role
{
int hp;
int mp;
};
Role create()
{
Role rt{ 00,100 };
return rt;
}
void ShowRole(Role&& role)
{
std::cout << role.hp;
}
int main()
{
ShowRole(create());
system("pause");
}
这种,第11行代码就要用到右值引用,这里create返回的是一个局部变量rt,下面用ShowRole接收后,,如果写成void ShowRole(Role role),就相当于再声明一个Role来保存,就造成内存浪费,可以用右值引用,就相当于直接接收了rt