左值与右值
2015-12-25 15:47
330 查看
为了支持移动操作,新标准引入了一种新的引用类型–右值引用。所谓右值引用就是必须绑定到右值的引用。我们可以通过&&来获得幼稚引用
例如
在这里i就是一个左值,它代表了自己是个int型变量(一种身份),而3则仅仅是一个值,所以其为右值。一般来说,右值为一个临时的值,我们取不到其地址,例如上面的3,而左值我们可以获得其地址,上面的i就是这样
编译上面的例子结果如下
可以看出当第17行我们给右值引用赋一个左值i时报错
当第18行我们给左值引用t赋一个临时的右值时也报错
这俩个特性意味着,使用幼稚引用的代码可以自由的接管所引用对象的资源
具体实例如下
调用了move函数就意味着我们和编译器做了一个约定:我想把这个左值像右值一样来处理它,之后我们除了重新赋值和销毁之外,我们将不在使用它
1.左值和右值的定义
左值和右值都是表达式的属性。一般而言,左值表达式表示的是一个对象的身份,而右值表达式表示的是一个对象的值例如
int i=3;
在这里i就是一个左值,它代表了自己是个int型变量(一种身份),而3则仅仅是一个值,所以其为右值。一般来说,右值为一个临时的值,我们取不到其地址,例如上面的3,而左值我们可以获得其地址,上面的i就是这样
2.如何确定用哪种引用
我们先来看几个例子吧9 #include<iostream> 10 #include<vector> 11 #include<string> 12 13 int main(int argc,char **argv) 14 { 15 int i = 3; 16 int &r = i; 17 int &&rr = i; 18 int &t = i*42; 19 int &&tt = i*42; 20 return 0; 21 }
编译上面的例子结果如下
可以看出当第17行我们给右值引用赋一个左值i时报错
当第18行我们给左值引用t赋一个临时的右值时也报错
从上面的例子我们不难发现,左值引用只可以引用左值类型,右值引用也只可以引用右值
3.左右值的区别
通过上面的叙述,我们可以得出来,左值为一个持久的对象,而右值为临时对象,由于右值引用绑定的为右值(临时对象),我们可以得出.所引用的对象将要销毁 .该对象没有其他用户
这俩个特性意味着,使用幼稚引用的代码可以自由的接管所引用对象的资源
4.新标准库move函数
根据上面判断左右值的方法,我们不难得出变量为一个左值。那么有什么办法使其可以变为一个右值呢?std::move就派上了用场,该函数,可以将一个左值转换为对应的右值引用类型具体实例如下
22 #include<iostream> 23 #include<vector> 24 #include<string> 25 #include <utility> 26 27 int main(int argc,char **argv) 28 { 29 int i = 3; 30 int &&rr = std::move(i); 31 return 0; 32 }
调用了move函数就意味着我们和编译器做了一个约定:我想把这个左值像右值一样来处理它,之后我们除了重新赋值和销毁之外,我们将不在使用它
相关文章推荐
- 在 Linux 中如何移动文件
- 局域网与广域网接口标准
- PowerShell移动目录中指定文件的方法(非全部文件)
- 鼠标触发移动的分层菜单 层菜单moveMenu
- web标准知识——从p开始,循序渐进
- 网页打开新窗口target=_blank不符合标准
- php实现复制移动文件的方法
- 对C语言编程标准以及声明的基本理解
- javascript实现图片跟随鼠标移动效果的方法
- JavaScript Select和Option列表元素上下左右移动
- XHTML标准的版本
- JS实现网页游戏中滑块响应鼠标点击移动效果
- JS+CSS实现分类动态选择及移动功能效果代码
- 详解jQuery移动页面开发中的ui-grid网格布局使用
- jquery移动点击的项目到列表最顶端的方法
- 基于jquery实现select选择框内容左右移动添加删除代码分享
- jquery实现select选择框内容左右移动代码分享
- 使用jQuery mobile库检测url绝对地址和相对地址的方法
- jQuery移动web开发之页面跳转和加载外部页面的实现