右值引用是C++11提出的新概念,通过这些操作,可以降低拷贝带来的消耗。
左值和右值
左值一般位于赋值号的左边,指的是一个对象本身,或者是一个持久的值,可以被多次引用和使用。例如赋值的返回值、下标操作、解引用以及前置递增等。左值必须在内存中有实体。
右值是一个短暂的值,代表对象的值,一般不可以引用,只在当前的表达式中有效。比如一个表达式的求值结果、函数返回值以及一个字面值等。(不一定是赋值号右边的值)右值可以存在于内存中或CPU寄存器中。
一个对象被用作右值时,使用的是它的内容,被用作左值时,使用的是它的地址。
引用
引用相当于变量的别名,实质上和指针一样,C++中用引用替代了指针。
引用的基本规则:
- 引用声明时,必须进行初始化,一旦绑定,不可以在绑定其他对象。
- 对引用的操作,就相当于是对原对象的操作。
一般地,一般引用称为左值引用,用&表示,数据类型 & 引用名 = 左值表达式;
必须绑定到右值的引用称为右值引用,用&&表示,数据类型 && 引用名 = 右值表达式。
例子:
左值引用:
int main()
{
int a = 10; //a为左值(变量),10为右值(短暂的)
int &b = a; //b为左值引用,a为左值表达式
//int &b = a+1; //错误,左值表达式初始化不能为临时值,a+1位临时值
cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;
b = a+1; //初始化之后,可以用右值表达式对左值引用进行修改,对b进行修改,实际上a也修改了。
cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;
return 0;
}
右值引用:
int main()
{
int a = 10; //a为左值(变量),10为右值(短暂的)
int &&c = a+5; //c为右值引用,a+5为右值表达式,只在当前表达式中有效。
int &&d = 20; //d位右值引用,初始化时,必须要用一个右值表达式,20也是右值表达式
cout<<"a= "<<a<<endl; //10
cout<<"c= "<<c<<endl; //15
cout<<"d= "<<c<<endl; //20
c = a;
d = a; //初始化之后,可以用左值表达式的值修改右值引用所引用的临时变量的值
cout<<"c= "<<c<<endl; //10
cout<<"d= "<<d<<endl; //10
return 0;
}