#include
#include
using namespace std;
// 测试左值、右值引用相关问题
void Sweap(int& pa, int& pb)
{
cout<< "交换之前:"<< pa << " "<< pb <<endl;
int temp = pa;
pa = pb;
pb = temp;
cout<< "交换之前:"<< pa << " "<< pb <<endl;
}
int main(){
int ia = 1;
int ib = 2;
// error:
Sweap(1,ib);
}
上述代码异常显示:不能将非常量的左值引用绑定到右值,下面我们根据这个报错信息,做如下展开分析。
先说一下修改策略
1:形参可以修改为右值引用
void Sweap(int&& pa, int& pb) {}
2:形参修改为常量的左值引用
void Sweap(const int& pa, int& pb)
1:可位于赋值号(=)左侧表达式的就是左值,反之只能位于赋值号右侧表达式的就是右值。
int a = 5 ; // 变量a 就是左值,字面量值5 就是右值
int b = 10 // b是一个左值
a=b // a,b都是左值,只不过b可以当做右值使用
10=b // error : 10是一个右值,不能当做左值使用
1:可位于赋值号(=)左侧表达式的就是左值,反之只能位于赋值号右侧表达式的就是右值。
int a = 5 ; // 变量a 就是左值,字面量值5 就是右值
int b = 10 // b是一个左值
a=b // a,b都是左值,只不过b可以当做右值使用
10=b // error : 10是一个右值,不能当做左值使用
以上面定义的变量a、b为例,a和b 是变量名,那么可以通过&a和&b获取他们存储地址,因此 a和b都是左值,反之,字面量 5,10他们既没有名称也无法获取存储地址(因为字面量通常存储在寄存器或者和代码一起),因此5,10都是右值
**基本语法: type &引用名 = 左值表达式**
基本语言: type &&引用名 = 右值表达式
来看一下左值和右值引用的例子
其实C++之所以设计出右值引用的语言:
主要还是因为对弈类似 b+1;这样的运算是发生在CPU寄存器上,寄存器上不能对其取地址,赋值等操作,所以这类符号(如加号+)只能放在右边,将其赋值给其他变量。
int main(){
cout << "-----引用左值-----------"<<endl;
int a = 5;
int &add_a(a);
cout << "a= "<<a << " ,"<< "&a= "<< &a<< endl;
cout<< "add_a = "<< add_a<< " ,"<< "&add_a ="<< &add_a << endl; cout<< "-------引用右值---------"<< endl;
int b = 10;
int &&add_b = 10+1; // 等价于 int &&add_b(b+1)
cout<<"b = "<< b << " ,"<< "&b = "<< &b<< endl;
cout<< "add_b = "<<add_b << " ,"<< "&add_b = "<< &add_b<< endl;
add_b++;
cout<< "add_b++ =" << add_b << " ,&add_b = "<< &add_b<<endl;}