C++11右值引用的用法

什么是右值引用

C++98提出引用,引用就是起别名,引用变量和被引用实体公用一块内存空间,C++11新提出了右值引用这一概念,右值引用也是起别名,只是它只能对右值引用

区别引用和右值引用

引用的表现形式:T& REF  = 实体;   T&& REF  = 右值;

什么是右值

  左值与右值是C 语言中的概念,但 C 标准并没有给出严格的区分方式,一般认为: 可以放在 = 左边的,或者能
够取地址的称为左值,只能放在=右边的,或者不能取地址的称为右值,但是也不一定完全正确
int g_a = 10;
// 函数的返回值结果为引用
int& GetG_A()
{
 return g_a; }
int main()
{
 int a = 10;
 int b = 20;
 
 // a和b都是左值,b既可以在=的左侧,也可在右侧,
 // 说明:左值既可放在=的左侧,也可放在=的右侧
 a = b;
 b = a;
 const int c = 30;
 // 编译失败,c为const常量,只读不允许被修改
 //c = a;
 // 因为可以对c取地址,因此c严格来说不算是左值
 cout << &c << endl;
 
 // 编译失败:因为b+1的结果是一个临时变量,没有具体名称,也不能取地址,因此为右值
 //b + 1 = 20;
 
 GetG_A() = 100;
 return 0; }
1. 普通类型的变量,因为有名字,可以取地址,都认为是左值。
2. const 修饰的常量,不可修改,只读类型的,理论应该按照右值对待,但因为其可以取地址 ( 如果只是
const 类型常量的定义,编译器不给其开辟空间,如果对该常量取地址时,编译器才为其开辟空间 )
C++11 认为其是左值。
3. 如果表达式的运行结果是一个临时变量或者对象,认为是右值。
4. 如果表达式运行结果或单个变量是一个引用则认为是左值。

  

总结:
1. 不能简单地通过能否放在 = 左侧右侧或者取地址来判断左值或者右值,要根据表达式结果或变量的性质
判断,比如上述: c 常量
2. 能得到引用的表达式一定能够作为引用,否则就用常引用。
C++11 对右值进行了严格的区分: 
C 语言中的纯右值,比如: a+b, 100
将亡值。比如:表达式的中间结果、函数按照值的方式进行返回。
 

普通类型引用只能引用左值不能引用右值,const类型引用可以引用左值还可以引用右值

int main()
{
 // 普通类型引用只能引用左值,不能引用右值
 int a = 10;
 int& ra1 = a; // ra为a的别名
 //int& ra2 = 10; // 编译失败,因为10是右值
 
 const int& ra3 = 10;
 const int& ra4 = a;
 return 0; }
C++11中右值引用:只能引用右值,一般情况不能直接引用左值
int main()
{
 // 10纯右值,本来只是一个符号,没有具体的空间,
 // 右值引用变量r1在定义过程中,编译器产生了一个临时变量,r1实际引用的是临时变量
 int&& r1 = 10;
 r1 = 100;
 int a = 10;
 int&& r2 = a; // 编译失败:右值引用不能引用左值
 return 0; }
 

右值引用的用法

右值引用一个重要用法就是实现移动语义:就是将一个对象中的资源转移到另一个对象中

右值引用引用左值

语法规定右值引用只能引用右值,但是在一些场景下我们确实需要用右值引用去引用左值,这时候就通过move函数将左值转发为右值,被转化的左值,其生命周期没有随着左值的转化而改变。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值