在C++中,左值(lvalue)是能够获取其地址的一个量。因为常常出如今赋值语句的左边。因此称之为左值。比如一个有名称的变量。

比如:

int a=10;
//a就是一个左值。

传统的C++引用,都是左值引用。比如:int &ra=a;将ra关联到a。这就是左值引用。

C++11,新增了右值引用的概念。

用&&代表右值引用。

首先我们来看一下什么叫做右值。

能够说全部不是左值的量都是右值。比如文本,暂时对象或者暂时值(都是不能获取地址的量)。

右值引用。就是一个对右值的引用。特别地,这是一个当右值是一个暂时对象时使用的概念。

比如。

int  &&ra=10;

     10就是一个右值。ra将是10这个右值的引用。看样例:

#include <iostream>
using namespace std;
int main()
{
int &&ra=9;
cout<<&ra<<endl<<ra<<endl;
ra=5;
cout<<&ra<<endl<<ra<<endl; cin.get();
}

输出结果:

有趣的是,将右值关联到右值引用将导致该右值被存储到特定的位置,且能够获取该位置的地址。

比如。你不能对右值9或者5进行&运算。可是能够对ra进行&运算。

右值引用的目的是提供一些涉及暂时对象时能够选用特定的方法(主要是复制构造函数以及operator=,但并不限于此)。因为知道暂时对象会被销毁。通过右值引用,某些涉及复制大量数据的操作能够通过简单地复制指向这些值的指针来实现。

方法能够将&&作为參数说明的一部分,从而指定右值引用參数。看样例:

#include <iostream>
using namespace std;
void showMax(int &a,int &b){
if(a>b)
cout<<a<<endl;
else
cout<<b<<endl;
}
int main()
{
int a=10;
int b=5;
showMax(a,b);
//showMax(20,15); // invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'|
cin.get();
return 0;
}

发现showMax(20,15)的时候无法正常编译。

这是由于20,15是一个右值。以下我们定义一个右值引用版本号的showMax();

#include <iostream>
using namespace std;
void showMax(int &a,int &b){
if(a>b)
cout<<a<<endl;
else
cout<<b<<endl;
};
void showMax(int &&a,int &&b){
cout<<"这是一个右值引用比較"<<endl;
if(a>b)
cout<<a<<endl;
else
cout<<b<<endl;
}
int main()
{
int a=10;
int b=5;
showMax(a,b);
showMax(20,15);
return 0;
}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

当调用showMax(20,15)的时候,编译器将自己主动调用相相应的右值引用的版本号。

作为方法的參数的时候右值引用很实用。又比如:

#include <iostream>
using namespace std;
void show(int &a){
cout<<"左值引用:"<<a<<endl;
};
void show(int &&a){
cout<<"这是一个右值引用:"<<a<<endl;
}
int main()
{
int a=10;
int b=5;
show(a);
show(a+b);
show(a++); //右值引用
show(++a); //左值引用
show(b+100);
show(100+200);
}

结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

须要注意的是:

show(a++);  //右值引用

    show(++a);  //左值引用

a++是先取出持久对象a的一份拷贝,再使持久对象a的值加1,最后返回那份拷贝,而那份拷贝是暂时对象(不能够对其取地址),故其是右值;

++a则是使持久对象a的值加1,并返回那个持久对象a本身(能够对其取地址),故其是左值。

右值引用单独使用的情况非常少。一般都是用于作为方法的參数或者函数的參数。使用的最多的情况则是用在移动语义之上。

最新文章

  1. kindeditor多图片上传找不到action原来是private File upload成员变量惹得祸
  2. 《Java中的不可变类》
  3. java中的继承Object
  4. Struts2 的国际化实现
  5. xen之基本搭建
  6. mysql 增量导入到elasticsearch
  7. opencv for python
  8. QStringList不是简单重命名的便利类,而是提供了额外的函数,比如sort和join等等
  9. Web自动化基础分享
  10. Touch 方法&amp;属性 映射工具
  11. Windows安装docker (带安装包)
  12. html_头部&lt;meta&gt;设置
  13. 对C语言指针的理解
  14. python之dict与set实现原理之hash算法
  15. jenkins GitHub 自动触发
  16. iTunes 12.7 没有应用程序选项了,重新安装iTunes 12.6.3
  17. bootstrap 文本对齐风格
  18. mvc扩展HtmlHelper功能
  19. 多线程编程——java
  20. POJ2585 Window Pains 拓扑排序

热门文章

  1. jQuery练手:仿新浪微博图片文字列表淡进淡出上下滚动效果
  2. C#版查杀本地/远程进程工具
  3. Back Track 5 之 网络踩点
  4. [Javascript] Understand Curry
  5. 【pyhon】理想论坛爬虫1.05版,将读取和写DB分离成两个文件
  6. T-SQL 之 事务
  7. android 随手记 仿微信的popwindow
  8. 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数。 (即,使用函数rand5()来实现函数rand7())
  9. oracl 、mysql在线查看文档
  10. java基础50道编程题