引用的概念:
C++98中首次提出了引用的概念,引用即别名。引用变量与其引用实体共用同一块存储空间,而引用的底层是通过指针来实现的,因此使用引用,可以提高程序的可读性。
引用的特性:
1.引用在定义时必须初始化。
2.一个变量可以有多个引用。
3.引用一旦引用一个实体,在不能引用其他实体。
为了提高程序的运行效率,C++11中引入了右值引用,右值引用也是别名,但其只能对右值引用。
那么到底什么是右值?
通常我们以等号“=”来区别右值和左值,等号左边的为左值,但是等号右边的却不一定是右值。
int a=10; int & b=a; 这种称之为左值引用。
int a=9;
int && ra=10; //右值引用
int b=30;
int && rb= b; 这种是错误的
C++11中规定如果需要引用左值必须加上关键字move进行左值的修饰
如:int &&rb=(move)b;
左值与右值的区别
1.普通类型的变量,因为有名字,可以取地址,都认为是左值。
2.const修饰的常量,不可修改,只读类型的,理论上应该按照右值对待,但因为其可以取地址(如果只是const类型常量的定义,编译器不给其开辟空间),C++11认为其是左值。
3.如果表达式的运行结果是一个临时变量或者对象,认为是左值。
4.如果表达式运行结果或单个变量是一个引用则认为是左值。
结论:
1.不能简单的通过是否放在=左右两侧或者取地址来判断左值或者右值吧,要根据表达式的结果或变量的性质判断。
2.能得到引用的表达式一定能作为引用,否则就用常引用。
普通引用只能引用左值,不能引用右值,const引用既可引用左值,也可引用右值。