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 ;
}

运行结果:

右值引用和std::move函数(c++11)的更多相关文章

  1. C++ 11中的右值引用以及std::move

    看了很多篇文章,现在终于搞懂了C++ 中的右值以及std::move   左值和右值最重要的区别就是右值其实是一个临时的变量 在C++ 11中,也为右值引用增加了新语法,即&&   比 ...

  2. C++ 11 右值引用以及std::move

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46779063 新类型: int和int&是什么?都是类型.int是整数类型,in ...

  3. Item 25: 对右值引用使用std::move,对universal引用则使用std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 右值引用只能绑定那些有资格被move的对象上去.如 ...

  4. C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

    这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...

  5. C++11右值引用和std::move语句实例解析

    关键字:C++11,右值引用,rvalue,std::move,VS 2015 OS:Windows 10 右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践 ...

  6. 透彻理解C++11新特性:右值引用、std::move、std::forward

    目录 浅拷贝.深拷贝 左值.右值 右值引用类型 强转右值 std::move 重新审视右值引用 右值引用类型和右值的关系 函数参数传递 函数返还值传递 万能引用 引用折叠 完美转发 std::forw ...

  7. 右值引用与转移语义(C++11)

    参考资料: http://www.cnblogs.com/lebronjames/p/3614773.html 左值和右值定义: C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值.通俗 ...

  8. C++11中的右值引用及move语义编程

    C++0x中加入了右值引用,和move函数.右值引用出现之前我们只能用const引用来关联临时对象(右值)(造孽的VS可以用非const引用关联临时对象,请忽略VS),所以我们不能修临时对象的内容,右 ...

  9. c++11的右值引用、移动语义

    对于c++11来说移动语义是一个重要的概念,一直以来我对这个概念都似懂非懂.最近翻翻资料感觉突然开窍,因此记下.其实搞懂之后就会发现这个概念很简单,并无什么高深的地方. 先说说右值引用.右值一般指的是 ...

随机推荐

  1. JAVA WEB开发中的会话跟踪

    常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. Http协议是一种无状态的协议,一旦数据交换完毕,客 ...

  2. Ubuntu技巧之清理系统中无用的软件包

    如果你频繁的在你的系统中安装/卸载,那么不时的清理一下你的系统是十分必要的. 在Ubuntu终端中执行如下命令: sudo apt-get autoremove 屏幕输出是这个样子的: Reading ...

  3. Kotlin语言学习笔记(7)

    反射 // 反射 val c = MyClass::class val c2 = MyClass::class.java // 获取KClass的引用 val widget: Widget = ... ...

  4. Haskell语言学习笔记(36)Data.List.Zipper

    ListZipper 模块 $ cabal install ListZipper Installed ListZipper-1.2.0.2 Prelude> :m +Data.List.Zipp ...

  5. static静态局部变量初始化问题

    第一次写博客之类的东西,主要是为了记录自己的学习过程,以便于记忆的加深和与各位大神进行探讨,学习更多的东西. 本次上传主要是关于静态局部变量的初始化问题. 首先,静态局部变量和全局变量一样,数据都存放 ...

  6. es进行curl请求时报错:missing authentication token for REST request

    把host 修改一下即可 ELASTICSEARCH_HOST=http://user:password@URL:port

  7. 关于struts.xml配置文件的说明

    <struts> <!-- action: 对应controller 中的类的 name: 匹配url要访问的类 class:包名+类名 通过反射产生对象 method:指定默认访问 ...

  8. dom node 查找父级parentNode

    var o = document.querySelectorAll("a[href='baidu.com']"); var p = o[o.length-1];console.lo ...

  9. idea下maven项目打包

    近使用idea运行maven需要打包上传tomcat服务器.但是网上一直零零碎碎的....自己记录一下.以防后面忘记 1.idea中.file →Project Structure(快捷键Ctrl+S ...

  10. Python vars() 函数

    Python vars() 函数  Python 内置函数 描述 vars() 函数返回对象object的属性和属性值的字典对象. 语法 vars() 函数语法: vars([object]) 参数 ...