右值引用和std::move函数(c++11)
2024-08-26 08:57:51
1.对象移动
1)C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力
2)优势:
- 在某些情况下,从旧内存拷贝到新内存是不必要的,此时对对象进行移动而非拷贝可以提升性能
- 有些类如IO类或unique_ptr类包含不能被共享的资源,它们不能被拷贝但是可以移动
3)移动操作“窃取”资源,并不分配任何内存
2.右值引用
1)C++11引入右值引有来支持移动操作,绑定到右值的引用称为右值引用,使用&&来绑定。
int& left=; //错误,左值引用必须绑定到左值上
int n=;
int& left=n; //正确
const int& left=; //正确,左值引用的一种特殊情况,可以将const的左值引用绑定到右值上 int&& right=; //正确,右值引用必须绑定到右值上
int&& right=n+; //正确,右值引用绑定到临时对象上
2)左值持久,右值短暂:左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时变量。右值引用指向将要被销毁的对象
3.move函数
1)std::move用来获得绑定到左值的右值引用,头文件<utility>,一般不省略std::(避免名字冲突)
int&& right=std::move(n);
2)调用move就意味着对编译器承诺:除了对源左值赋值和销毁之外,我们不对它进行其他任何操作
int main()
{
int n = ;
int&& right = std::move(n);
cout << right << endl; //输出:5
cout << n << endl; //输出:5 int num = std::move(n); //将得到的右值引用赋给一个左值,对于内置类型,源左值依然有效
cout << num << endl; //输出:5
cout << n << endl; //输出:5 string temp = "hehe";
string&& rig = std::move(temp);
cout << rig << endl; //输出:hehe
cout << temp << endl; //输出:hehe string str = std::move(temp); //将得到的右值引用赋给一个左值,对于类类型,源左值被清空
cout << str << endl; //输出:hehe
cout << temp << endl; //输出:空 return ;
}
运行结果:
最新文章
- 发布APP到app store
- 在 Delphi 中判断一个字符是中文的方法
- centos下 Vim快捷键操作命令大全
- POJ 1442 Black Box
- Freescale OSBDM JM60仿真器
- 从lambda到函数式编程
- 用linux的shell脚本把目录下面的所有文件的文件内容中的小写字母改成大写字母
- 第二章_session管理
- layer ifram 弹出框
- Vue.js的环境搭建
- python——爬虫&;问题解决&;思考(四)
- iOS 动画篇 之 Core Animation (一)
- [HNOI2007]紧急疏散
- LeetCode之“树”:Validate Binary Search Tree
- bzoj3534 [Sdoi2014]重建
- mysql处理重复数据
- 《python核心编程第二版》课后习题6-12答案
- Discuz! X3 全新安装图文教程
- 05 爬虫之scrapy
- 自定义配置编译linux内核
热门文章
- J2SE 8的集合
- CAAnimation临时取消动画,永久取消动画
- DataType 数据类型
- ArcGIS案例学习笔记1_1
- 求数组中的逆序对的数量----剑指offer36题
- Oracle VM VirtualBox做好虚拟硬盘后,如何进一步修改虚拟硬盘的大小
- java.lang.NullPointerException - 如何处理空指针异常
- datagrid数据表格的维护
- Element div is not closed
- 转---tcp三次握手四次挥手syn fin......