引用在c++代码的编写过程之中使用的频率可谓是非常之高,除了我们所熟知的指针引用、const引用、普通的引用(用"&"声明)之外,C++11 中新增了一种引用——右值引用。
一、定义
右值引用(rvalue reference),可指向右值,使用&&来声明,只能引用临时变量和常量值,并且右值引用的值可以被修改,主要是为类的移动语句做准备的。
代码演示:
#include<iostream>
#include<string>
using namespace std;
int main()
{
double a = 3.14;
//double& a1 = a * 2 + 3;//报错,普通引用不能引用临时变量
double&& a2 = a * 2 + 3;//用右值引用来引用临时变量
double&& b = sqrt(97);//用右值引用来引用临时变量
cout << "a2=" << a2 << ",b=" << b << endl;
a2=4.44;
b=5.55;
cout << "a2=" << a2 << ",b=" << b << endl;
return 0;
}
运行结果:
二、右值引用与其他引用的区别
1.const引用与右值引用的区别
const引用可引用普通左值、const左值、右值,并且不能被修改,数据属性为只读。
代码演示:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a = 66;
const int b = 11;
//const引用
const int& ca = a;//const引用,引用普通左值
const int& cb = b;//const引用,引用const左值
const int& c = 90;//condt引用,引用右值
cout << "ca=" << ca << ",cb=" << cb << ",c=" << c << endl;
//ca = 13;//error!!!报错,const引用的值不可以被修改
//cb = 90;//error!!!报错,const引用的值不可以被修改
//c = 12;//error!!!报错,const引用的值不可以被修改
//右值引用
//int&& ra = a;//error!!!报错,右值引用不能引用普通左值
//int&& rb = b;//error!!!报错,右值引用不能引用const左值
int&& d = a * 4;//右值引用,引用临时变量
int&& e = 30;//右值引用,引用常量
cout << "d=" << d << ",e=" << e << endl;
d = 12;//右值引用的值可以被修改
e = 89;//同上
cout << "d=" << d << ",e=" << e << endl;
return 0;
}
运行结果:
2.普通引用与右值引用的区别
普通引用只能引用普通左值,并且普通引用的值可以被修改,当普通引用的值被修改后,与之对应的左值也随之被修改。
代码演示:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a = 66;
//普通引用
/*int& pa;//所有的引用在定义时都必须进行初始化
pa = a;*/
int& pa = a;
cout << "a=" << a << ",pa=" << pa << endl;
pa = 100;//普通引用的值可以被修改,并且与之对应的左值也随之被修改
cout << "a=" << a << ",pa=" << pa << endl;
int&& b = a * 4;//右值引用,引用临时变量
int&& c = 30;//右值引用,引用常量
cout << "b=" << b << ",c=" << c << endl;
b = 12;//右值引用的值可以被修改
c = 89;//同上
cout << "b=" << b << ",c=" << c << endl;
return 0;
}
运行结果: